REST Web 服务返回 415 - 不支持的媒体类型

Posted

技术标签:

【中文标题】REST Web 服务返回 415 - 不支持的媒体类型【英文标题】:REST Webservice returning 415 - Unsupported Media Type 【发布时间】: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 - 你是赢家!你是对的,我什至不知道你需要在这些小客户端应用程序中设置它。您可以发布作为答案,我会接受。谢谢! 【参考方案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

【讨论】:

以上是关于REST Web 服务返回 415 - 不支持的媒体类型的主要内容,如果未能解决你的问题,请参考以下文章

github API check_runs 返回 415,“不支持的媒体类型”

带有 XML 参数的 REST 服务操作上的 HTTP 错误 415 不受支持的媒体类型(Jersey + Jetty)

带有 REST Post 请求的 415(不支持的媒体类型)

将整数列表发送到 REST API 会引发 415(不支持的媒体类型)

错误 415 不支持的媒体类型:如果是 JSON,则 POST 未达到 REST,但如果是 XML,则可以

SQL CLR 存储过程调用 Web 服务接收 System.Net.WebException:请求失败,HTTP 状态 415:不支持的媒体类型