错误415不支持的媒体types:如果JSON POST未达到REST,但是如果是XML,则不会
我实际上是新的REST WS,但我真的不明白这个415 Unsupported Media Type
。
我在火狐上testing了我的REST和Poster, GET
对我来说工作正常,也是POST
(当它是一个application/xml
),但是当我尝试application/json
根本没有达到WS时,服务器拒绝它。
这是我的url: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; } }
问题在于bean Customer的反序列化。 您的程序知道如何用XML编写JAXB,但Daniel最有可能不知道如何在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/
在REST Client头部分添加Content-Type: application/json
和Accept: application/json
以防万一这对他人有帮助,这是我的轶事:
我发现这个线程是由于我在使用Postman将testing数据发送到RESTEasy服务器时遇到的一个问题的结果,在重大的代码更改之后,我除了415 Unsupported Media Type错误外什么都没有。
长话短说,我撕下了一切,最终我试图运行我知道工作的简单的file upload的例子; 它没有。 那时我意识到问题出在我的邮差请求上。 我通常不会发送任何特殊的头文件,但在之前的testing中,我添加了一个“Content-Type”:“application / json”头文件。 当然,我试图上传“多部分/表格数据”。 删除它解决了我的问题。
道德:在炸毁你的世界之前检查你的标题。 ;)
我有同样的问题:
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>
我有这个问题,发现问题是我没有注册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
不要在您的方法中返回string,但Customer会自我反省,并让JAXB负责de /序列化。
我得到同样的问题。 实际上,这个请求并没有达到jersey注释的方法。 我解决了添加注释的问题:@Consumes(MediaType.APPLICATION_FORM_URLENCODED)注释@Consumes(“ / ”)不起作用!
@Path("/"+PropertiesHabilitation.KEY_EstNouvelleGH) @POST //@Consumes("*/*") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public void get__EstNouvelleGH( @Context HttpServletResponse response) { ... }