Ошибка 415 Неподдерживаемый тип носителя: POST не достигает REST, если JSON, но это происходит, если XML
Я на самом деле новичок в REST WS, но на самом деле я не получаю этот 415 Unsupported Media Type
.
Я тестирую свой REST с плакатом в Firefox, и GET
отлично работает для меня, также POST
(когда это application/xml
), но когда я пытаюсь application/json
он вообще не доходит до WS, сервер отвергает его ,
Это мой URL: http: // localhost: 8081 / RestDemo / services / customers / add
- Избегайте блокировки компаниями электронной почты для массового / массового рассылки электронной почты?
- Как сделать запрос HTTP-сообщения с телом JSON в Swift
Это JSON
Я отправляю: {"name": "test1", "address" :"test2"}
Это XML
который я отправляю:
test1 test2
и это мой class ресурсов:
@Produces("application/xml") @Path("customers") @Singleton @XmlRootElement(name = "customers") public class CustomerResource { private TreeMap customerMap = new TreeMap(); 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 getCustomers() { List customers = new ArrayList(); 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:
Это мой class Customer:
@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; } }
Проблема заключается в десериализации клиента компонента. Ваши программы знают, как это сделать в XML, с 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/
Добавить Content-Type: application/json
и Accept: application/json
в разделе заголовка клиента REST
На всякий случай это полезно для других, вот мой анекдот:
Я нашел этот stream в результате проблемы, с которой я столкнулся, когда я использовал Postman для отправки тестовых данных на сервер RESTEasy, где после значительного изменения кода я получал только 415 ошибок неподдерживаемого типа носителя.
Короче говоря, я сорвал все, в конце концов, я попытался запустить тривиальный пример загрузки файлов, который я знал; это не так. Именно тогда я понял, что проблема связана с моим запросом Postman. Обычно я не отправляю никаких специальных заголовков, но в предыдущем тесте я добавил заголовок «Content-Type»: «application / json». КУРС, я пытался загрузить «multipart / form-data». Удаление его решило мою проблему.
Мораль: проверьте свои заголовки, прежде чем взорвать свой мир. 😉
У меня была эта проблема, и я обнаружил, что проблема в том, что я не зарегистрировал class 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
У меня такая же проблема:
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 следующим образом. Попробуйте.
com.owlike genson 0.98
У меня такая же проблема. Фактически, запрос не дошел до аннотированного метода джерси. Я решил проблему с добавлением annotations: @Consumes (MediaType.APPLICATION_FORM_URLENCODED) Аннотации @Consumes (” / “) не работают!
@Path("/"+PropertiesHabilitation.KEY_EstNouvelleGH) @POST //@Consumes("*/*") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public void get__EstNouvelleGH( @Context HttpServletResponse response) { ... }
Не возвращайте строки в своих методах, но Клиент ставит их в соответствие с собой и позволяет JAXB позаботиться о де-сериализации.
У меня была та же проблема, поскольку она давала ошибку-415-unsupported-media-type при ударе после вызова с использованием json, в то время как у меня уже была
@Consumes(MediaType.APPLICATION_JSON)
и запрашивать заголовки, как в моем спокойном веб-сервисе, используя Jersey 2.0+
Accept:application/json Content-Type:application/json
Я решил эту проблему, добавив следующие зависимости к моему проекту
org.glassfish.jersey.media jersey-media-json-jackson 2.25
это добавит следующие библиотеки в вашу библиотеку:
- Джерси-медиа-JSON-ДЖЕКСОН-2.25.jar
- джерси-сущность-фильтрация-2.25.jar
- ДЖЕКСОН-модуль-JAXB-аннотаций-2.8.4.jar
- ДЖЕКСОН-jaxrs-JSON-провайдер 2.8.4.jar
- ДЖЕКСОН-jaxrs база-2.8.4.jar
Надеюсь, это сработает и для других, как и для меня.