83

我实际上是 REST WS 的新手,但我真的不明白415 Unsupported Media Type

我正在 Firefox 上使用 Poster 测试我的 REST,并且GET对我来说工作正常,POST(当它是 aapplication/xml时)但是当我尝试application/json它根本没有到达 WS 时,服务器拒绝它。

这是我的网址:http://localhost:8081/RestDemo/services/customers/add

这是JSON我要发送的:{"name": "test1", "address" :"test2"}

这是XML我要发送的:

<customer>
    <name>test1</name>
    <address>test2</address>
</customer>

这是我的资源类:

@Produces("application/xml")
@Path("customers")
@Singleton
@XmlRootElement(name = "customers")
public class CustomerResource {

    private TreeMap<Integer, Customer> customerMap = new TreeMap<Integer, Customer>();

    public  CustomerResource() {
        // hardcode a single customer into the database for demonstration
        // purposes
        Customer customer = new Customer();
        customer.setName("Harold Abernathy");
        customer.setAddress("Sheffield, UK");
        addCustomer(customer);
    }

    @GET
    @XmlElement(name = "customer")
    public List<Customer> getCustomers() {
        List<Customer> customers = new ArrayList<Customer>();
        customers.addAll(customerMap.values());
        return customers;
    }

    @GET
    @Path("/{id}")
    @Produces("application/json")
    public String getCustomer(@PathParam("id") int cId) {
        Customer customer = customerMap.get(cId); 
        return  "{\"name\": \" " + customer.getName() + " \", \"address\": \"" + customer.getAddress() + "\"}";

    }

    @POST
    @Path("/add")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public String addCustomer(Customer customer) {
         //insert 
         int id = customerMap.size();
         customer.setId(id);
         customerMap.put(id, customer);
         //get inserted
         Customer result = customerMap.get(id);

         return  "{\"id\": \" " + result.getId() + " \", \"name\": \" " + result.getName() + " \", \"address\": \"" + result.getAddress() + "\"}";
    }

}

编辑1:

这是我的客户类:

@XmlRootElement 
public class Customer implements Serializable {

    private int id;
    private String name;
    private String address;

    public Customer() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}
4

13 回答 13

140

在 REST Client 标头部分中添加Content-Type: application/jsonAccept: application/json

于 2012-11-21T08:40:31.320 回答
21

问题在于 bean Customer 的反序列化。您的程序知道如何在 XML 中使用 Daniel 编写的 JAXB,但很可能不知道如何在 JSON 中进行。

这里有一个 Resteasy/Jackson 的例子 http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/

与泽西岛相同: http ://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

于 2012-08-02T08:55:51.560 回答
17

以防万一这对其他人有帮助,这是我的轶事:

我发现这个线程是因为我在使用 Postman 将测试数据发送到我的 RESTEasy 服务器时遇到的一个问题,在进行重大代码更改之后,我得到的只是 415 Unsupported Media Type 错误。

长话短说,我把所有东西都撕掉了,最终我尝试运行我知道可行的简单文件上传示例;它没有。那时我意识到问题出在我的邮递员请求上。我通常不发送任何特殊的标头,但在之前的测试中,我添加了一个“Content-Type”:“application/json”标头。当然,我试图上传“multipart/form-data”。删除它解决了我的问题。

道德:在炸毁你的世界之前检查你的标题。;)

于 2014-03-14T19:47:28.327 回答
3

我遇到了这个问题,发现问题是我没有注册 JacksonFeature 类:

// Create JAX-RS application.
final Application application = new ResourceConfig()
    ...
    .register(JacksonFeature.class);

如果不这样做,您的应用程序将不知道如何将 JSON 转换为 java 对象。

https://jersey.java.net/documentation/latest/media.html#json.jackson

于 2014-04-30T18:51:45.610 回答
1

我有同样的问题:

curl -v -H "Content-Type: application/json" -X PUT -d '{"name":"json","surname":"gson","married":true,"age":32,"工资”:123,“hasCar”:true,“孩子”:[“serkan”,“volkan”,“aybars”]}' XXXXXX/ponyo/UserModel/json

* About to connect() to localhost port 8081 (#0)
*   Trying ::1...
* Connection refused
*   Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 8081 (#0)
> PUT /ponyo/UserModel/json HTTP/1.1
> User-Agent: curl/7.28.1
> Host: localhost:8081
> Accept: */*
> Content-Type: application/json
> Content-Length: 121
> 
* upload completely sent off: 121 out of 121 bytes
< HTTP/1.1 415 Unsupported Media Type
< Content-Type: text/html; charset=iso-8859-1
< Date: Wed, 09 Apr 2014 13:55:43 GMT
< Content-Length: 0
< 
* Connection #0 to host localhost left intact
* Closing connection #0

我通过将依赖项添加到 pom.xml 来解决它,如下所示。请尝试一下。

    <dependency>
        <groupId>com.owlike</groupId>
        <artifactId>genson</artifactId>
        <version>0.98</version>
    </dependency>
于 2014-04-09T14:03:14.800 回答
1

我得到同样的问题。事实上,请求并没有达到球衣注释的方法。我通过添加注释解决了这个问题:@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 注释@Consumes(" / ") 不起作用!

    @Path("/"+PropertiesHabilitation.KEY_EstNouvelleGH)
    @POST
    //@Consumes("*/*")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public void  get__EstNouvelleGH( @Context HttpServletResponse response) {
        ...
    }
于 2017-08-07T11:30:58.237 回答
0

不要在您的方法中返回字符串,而是将 Customer 对象自己返回并让 JAXB 负责反序列化。

于 2012-08-02T08:49:24.530 回答
0

我遇到了同样的问题,因为它在使用 json 进行通话后给出错误 415-unsupported-media-type而我已经有了

@Consumes(MediaType.APPLICATION_JSON) 

并使用 Jersey 2.0+在我的宁静 Web 服务中请求标头

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

我通过向我的项目添加以下依赖项解决了这个问题

<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.25</version>
</dependency>

这会将以下 jar 添加到您的库中:

  1. jersey-media-json-jackson-2.25.jar
  2. jersey-entity-filtering-2.25.jar
  3. jackson-module-jaxb-annotations-2.8.4.jar
  4. 杰克逊-jaxrs-json-provider-2.8.4.jar
  5. 杰克逊-jaxrs-base-2.8.4.jar

我希望它也适用于其他人,就像它对我一样。

于 2018-07-21T16:21:31.847 回答
0

当您将 JSON 与 POST/PUT 等一起使用时,只需将内容类型更改为 application/json...

于 2019-01-10T05:56:47.900 回答
0

如果您尝试使用来自 google 的 ARC 应用程序并发布 aXML并且您收到此错误,请尝试将正文内容类型更改为application/xml. 这里的例子

于 2019-05-14T10:41:30.913 回答
0

我在邮递员中遇到了同样的问题,我在标题部分选择了接受并将值提供为“应用程序/json”。所以我取消选中并选择了 Content-Type 并将值提供为“application/json”。那行得通!

于 2019-11-07T16:09:47.697 回答
0

如果没有一个解决方案有效并且您正在使用 JAXB,那么您需要注释您的类@XmlRootElement 以避免415 unsupported media type

于 2020-09-07T09:57:26.980 回答
-1

我在邮递员中使用时遇到了类似的问题。对于标题部分下的 POST 请求,将这些添加为

键:值对

内容类型:应用程序/json 接受:应用程序/json

我希望它会奏效。

于 2020-06-14T17:18:06.193 回答