无法将http post请求发送到spring boot

Posted

技术标签:

【中文标题】无法将http post请求发送到spring boot【英文标题】:Cannot send http post request to springboot 【发布时间】:2020-05-09 08:18:27 【问题描述】:

当我从我的 Angular 应用程序向 Spring Boot Rest API 发送 HTTP 发布请求时,请求失败并出现以下错误

浏览器错误

    HTTP Status 415 – Unsupported Media Type
    Type Status Report

    Description: The origin server is refusing to service the request because the payload is in a format 
    not supported by this method on the target resource

Spring boot 控制台报错

java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.LinkedHashMap
        at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:187) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:203) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
        at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:81) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
        .......

到目前为止我所尝试的

正如this 提到的解决方案,我已将必要的标头添加到来自角端的请求中

this.http.post(ipUrl, args,  headers: new HttpHeaders('Content-Type': 'application/json', 'Accept': 'application/json', 'Access-Control-Allow-Headers': 'Content-Type'));

作为this 的回答,我已将getters/setters 添加到模型对象中

我想知道我哪里出了问题以及如何解决这个问题?

更新

Springboot Rest Controller 方法

@PostMapping("/login")
  public @ResponseBody ResponseWrapper<WebUser> login(@RequestBody LoginData loginData)
    try 
      return loginService.loginProcess(loginData);
    
    catch (Exception ex)
      ProgrammerAlert.printStackTrace(ex);
      return new ResponseWrapper<>(ResponseWrapper.ERROR, ex.getMessage());
    
  

【问题讨论】:

请用 REST 控制器的代码更新问题?你在控制器方法中设置了生产和消费吗? @Smile 我没有将produces /consumes 添加到控制器方法中,因为我使用的是@PostMapping() 而不是@RequestMapping()。请查看更新后的问题 如果您尝试使用 Postman 或 Soap UI 等其他工具,它会起作用吗? @Smile No. 邮递员也有同样的错误 什么是“args”参数? 【参考方案1】:

我也遇到了同样的问题,我想这个问题的答案很清楚

HTTP Status 415 – Unsupported Media Type

在发送请求时,将内容类型设置为 json 而不是文本

【讨论】:

【参考方案2】:

根据您最近的编辑,您现在得到 406 Not Acceptable,要修复此错误,请保持 Spring Boot 应用程序响应的媒体类型与 Accept相同> 客户的标头。试试下面的。

    将produces 的值更改为MediaType.APPLICATION_JSON,因为您在客户端接受标头为“application/json”。另请注意:

APPLICATION_JSON_UTF8 已弃用,取而代之的是 APPLICATION_JSON

参考:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/MediaType.html

    遇到类似问题的朋友,也可以看看Accept header是否有错别字,因为我经常遇到这个问题。

【讨论】:

【参考方案3】:

您的返回对象应正确转换为 JSON。将 Jackson 添加到您的 pom(与启动器网络分开)并重试。

 <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.2</version>
</dependency>

【讨论】:

首先,我在 Spring Boot 控制台中遇到异常,在浏览器中遇到 http-415 错误。将produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE 添加到控制器注释后,这两个问题都得到了修复。但现在我收到http-406 错误 这是因为您来自服务器的响应仍然不可接受来自浏览器。确保您通过开发人员工具中的“网络”选项卡或使用类似邮递员的工具收到 Json 响应。 在浏览器网络选项卡或邮递员中,我得到空响应。 我认为我的请求没有被服务器处理。我添加了一些System.out.println()。它没有打印任何东西 逐行调试。在 IDE 中使用调试工具。【参考方案4】:

有什么理由不添加producesconsumes 属性吗?

@PostMapping("/login", produces = MediaType.APPLICATION_JSON_UTF8, consumes = MediaType.APPLICATION_JSON_UTF8)
public @ResponseBody ResponseWrapper<WebUser> login(@RequestBody LoginData loginData)
  try 
    return loginService.loginProcess(loginData);
  
  catch (Exception ex)
    ProgrammerAlert.printStackTrace(ex);
    return new ResponseWrapper<>(ResponseWrapper.ERROR, ex.getMessage());
  

或者,

您是否添加了任何 JSON 消息转换器,例如 jackson?检查您的应用程序是否具有以下依赖项

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

【讨论】:

我已经改变了我的控制器,就像你提到的那样。现在 spring boot 控制台没有显示任何错误。但浏览器给出HTTP 406 错误代码。知道为什么会出现错误吗? @Junyoung 的答案是正确的,请参考我更新的答案以单独更正 Accept 标头,生成应该是“application/json” - 与 accept 标头相同【参考方案5】:

你能这样写你的控制器吗?看看有没有反应。

 @ResponseBody
 @RequestMapping(value = "/login",
        method = RequestMethod.POST)
 public  ResponseWrapper<WebUser> login(...)
     .
     .
     .
  

您是否有不想使用 RequestMapping 的原因?

【讨论】:

以上是关于无法将http post请求发送到spring boot的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Postman 表单数据将 POST 请求发送到 Spring Boot REST API?

如何在 Spring Boot 框架中发送 HTTP 请求?

无法使用javascript向ASP.NET web api Controller发送http POST请求

无法使用 Postman 将 POST json 请求发送到 restful api

无法反序列化从 Springboot POST 映射函数上的 Angular http post 请求发送的 POJO

POST 请求的 HTTP 状态码 202 与 200