【问题标题】:REST Webservice returning 415 - Unsupported Media TypeREST Web 服务返回 415 - 不支持的媒体类型
【发布时间】:2014-09-15 21:53:36
【问题描述】:

我使用 jax-rs 和 jersey 创建了一个 REST Web 服务,它应该在 POST 请求上使用 JSON。我的网络服务类如下所示:

@Path("/webhookservice")
public class Webhook {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response readData (Song song) {

        // Prints out the song info
        System.out.println("SONG INFO \n=======================");
        System.out.println("songname: " + song.getSongname());
        System.out.println("artist: " + song.getArtist());

        // Repsonse with a HTTP 200 OK
        Response response = Response.status(200).build();
        return response;

    }

}

我的歌曲课:

public class Song {

    private String songname;
    private String artist;

    public String getSongname () { return this.songname; }
    public String getArtist () { return this.artist; }

    public void setSongname (String songname) { this.songname = songname; }
    public void setArtist (String artist) { this.artist = artist; }

}

我的 web.xml(如果需要)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">

    <servlet>
        <servlet-name>SnapScan-Webhook</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>za.co.lancet.service</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>SnapScan-Webhook</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

我正在使用RESTClient 一点,好吧,休息客户端...这是我发送的内容的屏幕截图:

当我发送它时,我收到 415 Unsupported Media Type 错误。有人知道为什么吗?

【问题讨论】:

  • 客户端是否发送标头Content-Type: application/json
  • 你知道你可能是对的。让我看看
  • @lefloh - 你是赢家!你是对的,我什至不知道你需要在这些小客户端应用程序中设置它。您可以发布作为答案,我会接受。谢谢!

标签: java json rest jersey jax-rs


【解决方案1】:

您需要发送请求标头Content-Type: application/json。似乎 REST-Client 不会为您自动添加此标头。

【讨论】:

  • 如何在android中以编程方式添加内容类型
【解决方案2】:

正如其他人指出的那样,您缺少正确的标题。将Content-Type: application/json 添加到“标题”:

【讨论】:

    【解决方案3】:

    我之前有同样的415 http 错误。我只是忘记了我的 DTO 类中的默认无参数构造函数。以与 JPA 实体类似的方式添加该构造函数,解决了我的问题,并且反序列化 JSON-&gt;Object 现在可以工作了。

    我不确定这是您的情况,查看您的代码,但它可能对其他在这里查看 415+JSON 问题的人有用。 问候

    【讨论】:

    • 您的回答为我节省了很多调试时间:D
    【解决方案4】:

    好的,在内容协商过程中通常会出现错误代码 1) 406 - 不可接受 2) 415 - 不支持的媒体类型

    406 是服务器不接受在请求的 ACCEPT 标头下发送的内容类型。

    415 是客户端在请求标头中发送内容类型,因此服务器直接拒绝说不支持的媒体类型

    要克服 406 - 我们必须包含适当的依赖 jar,例如客户端希望服务器能够理解 XML 输入,然后服务器需要具有 XML 相关的依赖项。

    克服 415 - 了解服务器支持的媒体类型,并在请求的 content-type 标头中传递正确的媒体类型

    【讨论】:

    • Theasker 有一些代码,你能用他的代码回答他并告诉他在哪里修复它吗?
    【解决方案5】:

    添加

    Content-Type: application/json and Accept: application/json 
    

    在 REST 客户端标头部分中

    【讨论】:

      【解决方案6】:

      这可能是因为您没有为 API 函数指定路径。您只在代码中指定了资源路径。

      @POST
      @Path("/somepath")
      @Consumes(MediaType.APPLICATION_JSON)
      public Response readData (Song song) {
        ...
      }
      

      【讨论】:

      • 据我所知,这是可选的,但不是必需的。不过我还是试试看
      【解决方案7】:

      我倾向于添加

      @Produces({"application/json"})
      

      我的服务反对顶级类声明并在适当的地方覆盖。

      例如

      @Path("/foo")
      @Produces({"application/json"})
      public class FooRestService {
      

      【讨论】:

        【解决方案8】:

        虽然分享的经验可能很愚蠢,但我会分享它以防万一它节省了其他人的时间。
        我有一组连续的函数,第一个是注释@BodyParser.Of(BodyParser.Json.class),当我评论第一个函数时,注释行被错误地未注释,所以这样的注释应用于第二个函数导致这样的415媒体类型错误
        hth

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-26
          • 1970-01-01
          • 2014-05-25
          • 1970-01-01
          • 2015-10-25
          • 2013-05-27
          • 2017-08-22
          • 2021-04-27
          相关资源
          最近更新 更多