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->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:不支持的媒体类型