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&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() 方法,因为您需要检索请求的正文而不是某些参数。

【讨论】:

以上是关于Spring / Angular 7 POST方法请求参数为空的主要内容,如果未能解决你的问题,请参考以下文章

不能在 Angular 7 中使用 Post 方法

Angular 1.4、POST、Spring Security、CORS

Angular 7:发送 post 请求给出错误 405(不允许的方法)

不支持 Spring 安全 Angular Post

将错误消息从 SSE (Webflux) Spring Boot 应用程序传递到 Angular 7 前端

Angular 和 Spring 启动 - POST 请求成为 OPTIONS