【问题标题】:Spring / Angular 7 POST method requestparameter is nullSpring / Angular 7 POST方法请求参数为空
【发布时间】: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,但如果您不喜欢它,则必须使用以下方法之一:stackoverflow.com/questions/8100634/…
  • 谢谢。如果我想使用@RequestBody,在这种情况下我该如何使用它? (因为如你所见,我有多个数组)
  • 您必须将 JSON 模式建模为带有列表的 Java 对象,正如 Marc 所说:stackoverflow.com/a/63595324/2470255

标签: java json angular spring spring-boot


【解决方案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&lt;java.util.ArrayList&lt;java.lang.String&gt;&gt; out of START_OBJECT token; 错误。
  • 如果我是正确的,那么我应该使用简单的字符串并自己解析所有内容?
  • 不,然后使用 pojo:public class Dto { @JsonProperty("mydata") public ArrayList&lt;ArrayList&lt;String&gt;&gt; myData; }
  • 我按照你写的那样尝试了 + 我必须将 this.http.post('api/example', { mydata: JSON.stringify(data) } 更改为 this.http.post('api/example', { mydata: data }(删除 JSON.stringify),现在它可以工作了,谢谢。
【解决方案2】:

您需要使用 .getReader(),而不是 .getParameter() 方法,因为您需要检索请求的正文而不是某些参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2019-10-21
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    相关资源
    最近更新 更多