it-roy-ru.com

Ошибка 415 Неподдерживаемый тип носителя: POST не доходя REST если JSON, но это делает, если XML

Я на самом деле новичок в REST WS, но на самом деле я не получаю этот 415 Unsupported Media Type

Я тестирую свой REST с помощью Poster на Firefox, и 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;
    }

}
65
mzereba

Проблема заключается в десериализации бобового клиента. Ваши программы знают, как сделать это в XML, с JAXB, как пишет Даниэль, но, скорее всего, не знают, как это сделать в JSON.

Здесь у вас есть пример с Resteasy/Джексон http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/

То же самое с Джерси: http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

20
unludo

Добавьте Content-Type: application/json и Accept: application/jsonin REST раздел заголовка клиента

121
Anup Awasthi

На всякий случай это полезно для других, вот мой анекдот:

Я нашел этот поток в результате проблемы, с которой я столкнулся, когда использовал Postman для отправки тестовых данных на мой сервер RESTEasy, где после значительного изменения кода я получал только 415 ошибок неподдерживаемого типа носителя.

Короче говоря, я разорвал все, в конце концов я попытался запустить простой пример загрузки файлов, который, как я знал, сработал; это не так. Именно тогда я понял, что проблема была с моей просьбой почтальона. Обычно я не отправляю никаких специальных заголовков, но в предыдущем тесте я добавил заголовок «Content-Type»: «application/json». Конечно, я пытался загрузить «multipart/form-data». Удаление это решило мою проблему.

Мораль: проверь свои заголовки, прежде чем взорвать свой мир. ;)

13
Max P Magee

У меня была эта проблема, и я обнаружил, что проблема в том, что я не зарегистрировал класс 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

3
David Hopkins

У меня такая же проблема: 

curl -v -H "Content-Type: application/json" -X PUT -d '{"name": "json", "фамилия": "gson", "замужем": true, "age": 32, " salary ": 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
User9527

Я получаю ту же проблему . На самом деле, запрос не достиг метода, помеченного джерси Я решил проблему с добавлением аннотации: @Consumes (MediaType.APPLICATION_FORM_URLENCODED) Аннотация @Consumes ( "/") не работает!

    @Path("/"+PropertiesHabilitation.KEY_EstNouvelleGH)
    @POST
    //@Consumes("*/*")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public void  get__EstNouvelleGH( @Context HttpServletResponse response) {
        ...
    }
1
Bertrand

Не возвращайте строки в ваших методах, но Customer возражает сам по себе и позволяет JAXB позаботиться о де/сериализации.

0
Daniel Kutik

Если вы пытаетесь использовать приложение ARC от Google и публикуете XML, и вы получаете эту ошибку, то попробуйте изменить тип содержимого тела на application/xml. Пример здесь

0
swati shilpa

просто измените тип содержимого на application/json, когда вы используете JSON с POST/PUT и т. д.

0
Chirag

У меня была та же проблема, так как она давала error-415-unsupported-media-type при выполнении пост-вызова с использованием json, пока у меня уже был 

@Consumes(MediaType.APPLICATION_JSON) 

и запрашивать заголовки, как в моем restful веб-сервисе с использованием Jersey 2.0+

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. джерси-медиа-JSON-ДЖЕКСОН-2.25.jar
  2. джерси-сущность-фильтрация-2.25.jar
  3. дЖЕКСОН-модуль-JAXB-аннотаций-2.8.4.jar
  4. дЖЕКСОН-jaxrs-JSON-провайдер 2.8.4.jar
  5. дЖЕКСОН-jaxrs база-2.8.4.jar

Я надеюсь, что это будет работать и для других, как и для меня.

0
Prakhar Agrawal