错误415不支持的媒体类型:如果为JSON,则POST无法到达REST,但如果为XML,则为POST


78

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

我正在Firefox上用Poster测试我的REST,GET对我来说也很好,也可以POST(当它是时application/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>

这是我的Resource类:

@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;
    }

}

你的Customer班级怎么样?您在上面使用哪些JAXB注释?

谢谢,我使用Customer类更新了代码。
mzereba 2012年

Answers:


20

问题在于bean客户的反序列化。您的程序知道如何使用XML进行编码,就像Daniel所写的那样使用JAXB,但是很可能不知道如何使用JSON进行编码。

在这里,您有Resteasy / Jackson的示例 http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/

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


1
在这些示例中,输入的内容与我的完全相同,返回的内容也有所不同(如Daniel所说),但是我的问题还在前面,我一点也不上课。
mzereba 2012年

@Maged,您使用resteasy还是运动衫?
Unludo 2012年

@Maged您是否按照文章中的说明更新了web.xml?
2012年

是的,我确实添加了映射位<init-param> <param-name> com.sun.jersey.api.json.POJOMappingFeature </ param-name> <param-value> true </ param-value> </ init- param>
mzereba

1
从ios部分解决了此链接stackoverflow.com/questions/19396696/…的问题,我们不得不提到在您的POST请求
中使

134

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


4
REST Client标头部分在哪里?
tamuren

1
如果从命令行使用curl调用,则可以按如下所示添加标头:[$> curl -H“ Content-Type:application / json” -X POST -d'{“ name”:“ my_name”,“ password “:” 123456“}' localhost:8080 / url]
Muhammad Suleman 2013年

需要您的帮助,我是该REST API创建的新手,EST客户端标头节位于何处?
Naveenbos 2014年

2
对于从另一种语言到达此处并且该语言是Ruby且您正在使用rest-client的任何人,此答案对我都有帮助。用法示例response = RestClient.post "https://pod12.salesforce.com/services/data/v33.0/sobjects/Contact/", {Email: user.email, LastName: user.last_name, FirstName: user.first_name, Phone: user.phone}.to_json, {Authorization: "Bearer #{access_token}", :"Content-Type" => "application/json", :"Accept" => "application/json"}
Michael

对我也有帮助。记住将有效负载作为JSON传递:requests.post("/login", data = json.dumps(loginCredentials), headers = {"Content-Type": "application/json", "Accept": "application/json"})
Kaivosukeltaja

16

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

我发现此线程是我在使用Postman将测试数据发送到RESTEasy服务器时遇到的问题的结果,在那里-在重大代码更改后-除了415 Unsupported Media Type错误外,我什么也没得到。

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

道德:炸毁世界之前,请检查标头。;)


3
对于“确保已插入烤面包机”的建议,请+1。刚遇到同样的问题,当您确信问题出在代码中时,很容易忽略。
Jared G

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


1
你能解释更多吗?我几乎尝试了所有事情,但我想我错过了这一点。我应该在哪里进行注册?感谢
Armen

非常感谢,我在启动灰熊服务器时遇到了这个问题。当通过IDE或mvn:exec正确启动所有内容时,但使用带有依赖项的jar时则不正确。你让我感到高兴!
朱利安

1

我有同样的问题:

curl -v -H“ Content-Type:application / json” -X PUT -d'{“ name”:“ json”,“ surname”:“ gson”,“ married”:true,“ age”:32,“薪水”:123,“ hasCar”:true,“ childs”:[“ 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>

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) {
        ...
    }

0

不要在您的方法中返回String,但是Customer会自我反对,并让JAXB负责反序列化。


2
可能是,但我认为这里的问题仍然存在,我根本没有提供服务。
mzereba

0

我遇到了同样的问题,因为在我已经拥有json的情况下,使用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. 杰克逊模块-jaxb-annotations-2.8.4.jar
  4. jackson-jaxrs-json-provider-2.8.4.jar
  5. jackson-jaxrs-base-2.8.4.jar

我希望它也会像对我一样对其他人有用。


0

当您将JSON与POST / PUT等结合使用时,只需将内容类型更改为application / json即可。



0

我在邮递员中遇到了同样的问题,我在标题部分选择了“接受”,并将值提供为“ application / json”。因此,我取消选中并选择Content-Type并将其值提供为“ application / json”。可行!


0

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

键:值对

内容类型:application / json接受:application / json

我希望它能工作。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.