Ошибка 415 Неподдерживаемый тип носителя: POST не достигает REST, если JSON, но это происходит, если XML
Я действительно новичок в REST WS, но на самом деле я не получаю этот 415 Unsupported Media Type
.
Я тестирую свой REST с плакатом в Firefox, а GET
отлично работает для меня, а также POST
(когда он a 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:
Это мой класс 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;
}
}
Ответы
Ответ 1
Проблема заключается в десериализации клиента bean. Ваши программы знают, как это сделать в 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/
Ответ 2
Добавить Content-Type: application/json
и Accept: application/json
в разделе заголовка клиента REST
Ответ 3
На всякий случай это полезно для других, вот мой анекдот:
Я нашел этот поток в результате проблемы, с которой я столкнулся, когда я использовал Postman для отправки тестовых данных на сервер RESTEasy, где после значительного изменения кода я получал только 415 ошибок неподдерживаемого типа носителя.
Короче говоря, я сорвал все, в конце концов, я попытался запустить тривиальный пример загрузки файла, который я знал; это не так. Это, когда я понял, что проблема связана с моим сообщением Postman. Обычно я не отправляю никаких специальных заголовков, но в предыдущем тесте я добавил заголовок "Content-Type": "application/json". КУРС, я пытался загрузить "multipart/form-data". Удаление этого решения решило мою проблему.
Мораль: проверьте свои заголовки, прежде чем взорвать свой мир.;)
Ответ 4
У меня была эта проблема и я обнаружил, что проблема в том, что я не зарегистрировал класс 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
Ответ 5
У меня была та же проблема:
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>
Ответ 6
У меня такая же проблема.
Фактически, запрос не дошел до аннотированного метода джерси.
Я решил проблему с добавлением аннотации: @Consumes (MediaType.APPLICATION_FORM_URLENCODED)
Аннотация @Consumes ( "/" ) не работает!
@Path("/"+PropertiesHabilitation.KEY_EstNouvelleGH)
@POST
//@Consumes("*/*")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void get__EstNouvelleGH( @Context HttpServletResponse response) {
...
}
Ответ 7
Не возвращайте строки в своих методах, но клиент ставит их сам и позволяет JAXB позаботиться о де-сериализации.
Ответ 8
У меня была та же проблема, так как она выдавала error-415-unsupported-media-type при нажатии на пост-вызов с использованием json, пока у меня уже был
@Consumes(MediaType.APPLICATION_JSON)
и запрашивать заголовки, как в моем спокойном веб-сервисе, используя 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 файлы в вашу библиотеку:
- Джерси-медиа-JSON-ДЖЕКСОН-2.25.jar
- джерси-сущность-фильтрация-2.25.jar
- ДЖЕКСОН-модуль-JAXB-аннотаций-2.8.4.jar
- ДЖЕКСОН-jaxrs-JSON-провайдер 2.8.4.jar
- ДЖЕКСОН-jaxrs база-2.8.4.jar
Я надеюсь, что это будет работать и для других, как и для меня.
Ответ 9
просто измените тип содержимого на application/json, когда вы используете JSON с POST/PUT и т.д.
Ответ 10
Если вы пытаетесь использовать приложение ARC от Google и опубликовать XML
и у вас появляется эта ошибка, попробуйте изменить тип содержимого тела на application/xml
. Пример здесь