REST Webservice返回415-不支持的媒体类型。

20

我使用jax-rs和jersey创建了一个REST webservice,它应该能够在POST请求中消耗JSON。我的webservice类如下所示:

@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,一个小巧的REST客户端... 这是我所发送内容的屏幕截图:

输入图像描述

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


3
客户端是否发送了头文件 Content-Type: application/json - lefloh
你知道吗,你可能是对的。让我看看。 - user818700
@lefloh - 你是赢家!你说得对,我甚至不知道在这些小客户端应用程序中需要设置它。你可以发布为答案,我会接受的。谢谢! - user818700
8个回答

47

您需要发送请求头Content-Type: application/json。看起来REST客户端不会自动为您添加此标头。


如何在Android中以编程方式添加内容类型 - Stark

7

正如其他人所指出的,您缺少正确的标题。在“Headers”中添加Content-Type: application/json

enter image description here

4
我之前也遇到过同样的http错误代码415。我简单地忘记了在我的DTO类中添加默认无参构造函数。类似于JPA实体,添加该构造函数解决了我的问题,并使得JSON反序列化为Object现在可以工作了。
根据你的代码,我不确定这是否适用于你,但对于其他遇到415+JSON问题的人可能会有帮助。
祝好。

1
你的回答让我省去了很多调试的时间 :D - Michał Piątkowski

1

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

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

415表示客户端在请求头中发送了一个内容类型,因此服务器直接拒绝并说不支持该媒体类型。

要解决406 - 我们必须包含适当的依赖JAR,例如客户端希望服务器理解XML输入,则服务器需要具有与XML相关的依赖项。

要解决415 - 理解服务器支持的媒体类型,并在请求的内容类型头中传递正确的媒体类型。


请问您能否使用提问者的代码回答他的问题,并指出需要修复的地方? - Ibo

1
添加
Content-Type: application/json and Accept: application/json 

在REST客户端的头部部分。

0
可能是因为您没有为API函数指定路径。您在代码中只指定了资源路径。
@POST
@Path("/somepath")
@Consumes(MediaType.APPLICATION_JSON)
public Response readData (Song song) {
  ...
}

据我所知,这是可选的但不是必需的。无论如何,我会尝试一下。 - user818700

0

我倾向于添加

@Produces({"application/json"})

针对顶层类声明和适当的覆盖,返回我的服务。

例如:

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

0

虽然这可能是一个愚蠢的经历,但我还是想分享一下,以防能够帮助到其他人。
我有一组连续的函数,第一个函数使用了注释@BodyParser.Of(BodyParser.Json.class),当我注释掉第一个函数时,由于疏忽没有注释掉该行注释,因此该注释被应用在第二个函数上,导致出现415媒体类型错误。
希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接