Spring / Angular 7 POST方法请求参数为空
Posted
技术标签:
【中文标题】Spring / Angular 7 POST方法请求参数为空【英文标题】:Spring / Angular 7 POST method requestparameter is null 【发布时间】:2020-12-14 23:15:29 【问题描述】:我想使用 POST 从前端向后端发送数据(以 json 形式),但请求参数为空。
角度:
this.http.post('api/example', mydata: JSON.stringify(data) ,
"headers": header: "text/html;charset=UTF-8" ).subscribe(Response => console.log(Response);
);
JSON.stringify(data) 看起来像这样:
[
["num1","num2","num3","num4","num5", "num6"],
["test6","test2","test1","test5","test4", "test3"]
]
这只是一个例子,数据是动态的,所以有时我会有更多或更少的列和行。
Spring 后端:
@RequestMapping(value = "/api/example", method = RequestMethod.POST)
public @ResponseBody void postExample(HttpServletRequest request, HttpServletResponse response)
throws IOException
HttpSession session = request.getSession();
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
String mydata = request.getParameter("mydata");
System.out.println(mydata);
...
当我打印出来时,mydata 为空。我不知道为什么。 我尝试了什么:
将“text/html”更改为“application/json”和“application/*”和“text/plain”(并希望在后端将文本转换为 json,但仍为空参数)我想使用“getParameter”而不是使用@RequestBody 注释。
如何从前端获取 json 数据并在后端使用?
编辑: 本来我并不想用@RequestBody,但是如果我想用它,我怎么用它来获取这些json数组呢?
【问题讨论】:
问题是mydata
不是请求参数,而是请求体。最简单的方法是使用@RequestBody
,但如果您不喜欢它,则必须使用以下方法之一:***.com/questions/8100634/…
谢谢。如果我想使用@RequestBody,在这种情况下我该如何使用它? (因为如你所见,我有多个数组)
您必须将 JSON 模式建模为带有列表的 Java 对象,正如 Marc 所说:***.com/a/63595324/2470255
【参考方案1】:
要使用@RequestBody,您需要一个与您的 JSON 匹配的 Java 数据结构, 例如嵌套数组
@PostMapping(path="/api/example")
public void postExample(@RequestBody ArrayList<ArrayList<String>> body)
//....
测试用例(来自上述问题)
[
["num1","num2","num3","num4","num5", "num6"],
["test6","test2","test1","test5","test4", "test3"]
]
【讨论】:
我试过这个但我发现了一个问题,当我以角度打印出JSON.stringify(data)
时,我们可以看到正确的json(见上文),但是当我使用@RequestBody String mydata
时,我会得到这个:"mydata":"[[\"num1\",\"num2\",\"num3\",\"num4\",\"num5\",\"num6\"],[\"test6\",\"test2\",\"test1\",\"test5\",\"test4\",\"test3\"]]"
之后如果我将 String 更改为 ArrayList>,我会得到 JSON parse error: Cannot deserialize instance of java.util.ArrayList<java.util.ArrayList<java.lang.String>> out of START_OBJECT token;
错误。
如果我是正确的,那么我应该使用简单的字符串并自己解析所有内容?
不,然后使用 pojo:public class Dto @JsonProperty("mydata") public ArrayList<ArrayList<String>> myData;
我按照你写的那样尝试了 + 我必须将 this.http.post('api/example', mydata: JSON.stringify(data)
更改为 this.http.post('api/example', mydata: data
(删除 JSON.stringify),现在它可以工作了,谢谢。【参考方案2】:
您需要使用 .getReader(),而不是 .getParameter() 方法,因为您需要检索请求的正文而不是某些参数。
【讨论】:
以上是关于Spring / Angular 7 POST方法请求参数为空的主要内容,如果未能解决你的问题,请参考以下文章
Angular 1.4、POST、Spring Security、CORS
Angular 7:发送 post 请求给出错误 405(不允许的方法)