Помилка 415 Непідтримуваний тип носія: POST не досягає REST, якщо JSON, але це робить, якщо XML


78

Я насправді новачок у 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>

і це мій клас 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() + "\"}";
    }

}

EDIT 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

Відповіді:


20

Проблема полягає в десериалізації замовника бобів. Ваші програми знають, як це зробити в 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/


1
У цих прикладах вхідні дані точно такі ж, як і мої, віддача інша (як сказав Даніель), але моя проблема попереду, і я взагалі не потрапляю в клас.
mzereba

@Maged чи використовуєш ти рестайлі чи джерсі?
unludo

@Maged Чи ви оновлювали свій web.xml, як описано в статті?
unludo

Так, я додав біт відображення <init-param> <param-name> com.sun.jersey.api.json.POJOMappingFeature </param-name> <param-value> true </param-value> </ init- param>
mzereba

1
Вирішено проблему за цим посиланням stackoverflow.com/questions/19396696/… з частини ios, яку ми повинні згадати Зробити тип вмісту "application / json; odata = детальний" у вашому запиті на POST
Naveenbos

135

Додайте Content-Type: application/jsonта Accept: application/json в розділ заголовка REST Client


4
Де знаходиться розділ заголовка REST Client?
tamuren

1
якщо ви використовуєте виклик curl з командного рядка, тоді ви можете додати заголовок таким чином: [$> curl -H "Content-Type: application / json" -X POST -d '{"name": "my_name", "password ":" 123456 "} ' localhost: 8080 / url]
Мухаммад Сулеман,

Потрібна ваша допомога, я новачок у цьому створенні API для відпочинку, де знаходиться розділ заголовка EST Client?
Naveenbos

2
Для тих, хто звернувся сюди з іншої мови, якою була Рубі, і ви використовуєте клієнт відпочинку, ця відповідь мені допомогла. Приклад використання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"}
Майкл

Допоміг мені і на Python. Не забудьте передати корисне навантаження як JSON:requests.post("/login", data = json.dumps(loginCredentials), headers = {"Content-Type": "application/json", "Accept": "application/json"})
Кайвосукелтая

16

На випадок, якщо це корисно для інших, ось мій анекдот:

Я знайшов цей потік в результаті проблеми, з якою я зіткнувся під час використання Postman для надсилання тестових даних на мій сервер RESTEasy, де - після значної зміни коду - я не отримував нічого, крім 415 помилок непідтримуваного типу носія.

Коротше кажучи, я все вирвав, врешті-решт спробував запустити тривіальний приклад завантаження файлів, який, як я знав, працював; це не так. Тоді я зрозумів, що проблема полягає в моєму запиті листоноші. Зазвичай я не надсилаю жодних спеціальних заголовків, але в попередньому тесті я додав заголовок "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
Ви можете пояснити трохи більше? Я майже все пробував, і думаю, що цей момент мені не вистачає. де мені зробити цю реєстрацію? Подяка
Армен

Велике спасибі, я зіткнувся з цим під час запуску сервера гризлі. При запуску з IDE або mvn: виконуйте все належним чином, але не при використанні jar з залежностями. Ви влаштували мені день, сер!
Жульєн

1

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

curl -v -H "Тип вмісту: application / json" -X PUT -d '{"назва": "json", "прізвище": "gson", "одружений": правда, "вік": 32, " зарплата ": 123," hasCar ": правда," діти ": [" 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

Не повертайте рядки у своїх методах, але Клієнт заперечує проти цього, і нехай JAXB подбає про де / серіалізацію.


2
Може бути, але я думаю, що тут проблема попереду, я взагалі не вражаю службу.
mzereba

0

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

@Consumes(MediaType.APPLICATION_JSON) 

і запитувати заголовки, як у моєму спокійному веб-сервісі з використанням Джерсі 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>

це додасть до вашої бібліотеки наступні баночки:

  1. jersey-media-json-jackson-2.25.jar
  2. jersey-entity-filtering-2.25.jar
  3. jackson-module-jaxb-annotations-2.8.4.jar
  4. jackson-jaxrs-json-provider-2.8.4.jar
  5. jackson-jaxrs-base-2.8.4.jar

Я сподіваюся, це буде працювати і для інших, як і для мене.


0

просто змініть тип вмісту на application / json, коли ви використовуєте JSON з POST / PUT тощо ...


0

Якщо ви намагаєтесь використовувати програму ARC від google та опублікувати повідомлення, XMLі ви отримуєте цю помилку, спробуйте змінити тип вмісту тіла на application/xml. Приклад тут


0

Я зіткнувся з тією ж проблемою у листоноші, я вибрав Accept у розділі заголовка та надав значення як "application / json". Тому я зняв прапорець і вибрав Content-Type і вказав значення як "application / json". Це спрацювало!


0

У мене була подібна проблема під час використання у листоноші. для запиту POST у розділі заголовка додайте їх як

ключ: valuepair

Тип вмісту: application / json Прийняти: application / json

я сподіваюся, що це спрацює.


0

Якщо жодне з рішень не спрацювало, і ви працюєте з JAXB, то вам потрібно анотувати свій клас, @XmlRootElement щоб уникнути415 unsupported media type

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.