【问题标题】:HTTP Status 415 - request entity is in a format not supportedHTTP 状态 415 - 请求实体的格式不受支持
【发布时间】:2016-02-01 03:47:23
【问题描述】:

我正在开发 java restful web 服务。我让它适用于 GET 请求,但 POST 请求不起作用。我的控制器类是RestController。到目前为止,我已经完成了这些:

@RequestMapping(value = "/api/signup", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public long signUp(@ModelAttribute ApiMemberModel apiMember) {
    memberService = new MemberDetailsService();
    Member m = memberService.createMember(apiMember.getUsername(), apiMember.getPassword(), apiMember.getEmail(), "");
    return m.getId();
}

还尝试了 RequestBody 而不是 ModelAttribute。

我使用Postman extension 发送 POST 请求。例如:

{
    "username": "asd",
    "password": "sfsdg",
    "email": "sdfdsf@fdsfkg.com"
}

但我得到了错误:

description The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.

我做错了什么?模型类是:

 public class ApiMemberModel {
    private String username;
    private String password;
    private String email;

    public ApiMemberModel(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

【问题讨论】:

  • 向我们展示你的模型类的代码
  • “还尝试了 RequestBody 而不是 ModelAttribute。”,没错,但您还需要模型上的无参数构造函数,否则 Jackson 无法创建它。或使用@JsonCreator

标签: java json web-services rest


【解决方案1】:

在您的 xml 文件中添加“注释驱动”行或将内容类型添加为 application/json

【讨论】:

  • 在我的调度程序 servlet 中添加 解决了我的问题。
【解决方案2】:

我有点不好意思写这个,但是我忘了把enctype="multipart/form-data"属性放在表单标签里:

<form action="rest/upload_function_path" method="post" enctype="multipart/form-data">
<!-- this thing right  --------------------------------^ there! -->
    <p>
    Your file is: <input type="file" name="fajl" />
    </p>
    <input type="submit" value="Upload It" />
</form>

这是一个相当蹩脚的错误,但也是需要一些时间才能意识到的。

【讨论】:

    【解决方案3】:

    我也有同样的问题。将 ContentType 标头添加到应用程序/xml(或您的服务所期望的任何内容)到邮递员。

    【讨论】:

      【解决方案4】:

      Spring 提供了许多开箱即用的默认 HttpMessageConverters,它们将用于转换,具体取决于项目类路径中是否存在某些库。

      例如,如果请求 Header 中的 Content-Type 是 application/json 或 application/xml 之一,这意味着 POST 正文包含 json 或 XML[流行格式],如果在您的类路径中找到 Jackson 库,则 Spring会将转换委托给 MappingJackson2HttpMessageConverter [for json] 或 MappingJackson2XmlHttpMessageConverter [for xml]。

      要声明对 Jackson 库 (jackson-databind) 的依赖,请在您的 pom.xml 中包含以下依赖

      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>${jackson.version}</version>
      </dependency>
      

      【讨论】:

        【解决方案5】:

        我敢打赌,来自 Postman 的电话不包括 Content-Type: application/json

        HTTP 415 表示服务器不理解请求的媒体格式。在您的控制器中,您指定它接受 JSON,但您没有说明请求是否指示正文采用该格式。仅仅因为您将数据以JSON格式放置,并不意味着服务器会识别它,您必须在Content-Type标头中注明。

        【讨论】:

        • 谢谢!指定 Content-type 并添加无参数构造函数有助于解决我的问题。
        • 你是对的。即使在使用 jsonlint.com 之后,我也想知道为什么我的 JSON 无效。
        • 嗨!即使我在客户端指定 Content-Type,我也有同样的问题。你能帮帮我吗?
        • @Llg 请检查我的答案,以及其他人的答案。那里有很多解释,我很确定没有小精灵或精灵在你背后工作;)
        猜你喜欢
        • 1970-01-01
        • 2013-01-22
        • 2015-06-17
        • 2018-01-19
        • 2015-07-24
        • 2012-03-03
        • 2011-08-02
        • 1970-01-01
        • 2020-09-25
        相关资源
        最近更新 更多