L’errore 415 Unsupported Media Type: POST non raggiungendo il RESTO se JSON, ma se XML

In realtà sono nuovo del RESTO WS, ma davvero non capisco questo 415 Unsupported Media Type.

Sto testando il mio RIPOSO con Poster su Firefox e il GET funziona bene per me, anche il POST (quando si tratta di un application/xml), ma quando cerco application/json non raggiungere il WS a tutti, il server rifiuta.

Questo è il mio URL: http://localhost:8081/RestDemo/servizi/clienti/aggiungere

Questo è JSON sto inviando: {"name": "test1", "address" :"test2"}

Questo è XML sto inviando:

<customer>
    <name>test1</name>
    <address>test2</address>
</customer>

e questa è la mia classe di Risorse:

@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:

Questo è il mio Cliente classe:

@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;
    }

}
  • Come funziona il vostro Customer classe, come? Cosa JAXB annotazioni si usa su di esso?
  • Grazie, ho aggiornato il codice con la mia classe del Cliente.
InformationsquelleAutor mzereba | 2012-08-02



10 Replies
  1. 19

    Il problema è il deserializzazione del fagiolo Cliente. I programmi sa come farlo in XML, con JAXB come Daniel è la scrittura, ma la maggior parte probabilmente non sa come farlo in JSON.

    Qui avete un esempio con Resteasy/Jackson
    http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/

    Lo stesso con il Jersey:
    http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

    • In questi esempi l’ingresso è esattamente lo stesso come il mio, il ritorno è diverso (come Daniel detto), ma il mio problema è avanti e non sto colpendo la classe.
    • si usa resteasy o maglia?
    • jersey effettivamente…
    • Non si aggiorna il web.xml come spiegato nell’articolo?
    • Yeap ho fatto aggiungere la mappatura di bit <init-param> <param-name>com.sole.jersey.api.json.POJOMappingFeature</param-name> <param-value>vero</param-value> </init-param>
    • puoi provare a rimuovere il costruttore di default sul vostro cliente di fagioli?
    • purtroppo restituisce errore stesso e di non accedere al servizio…questo è davvero strano perché ho trovato un sacco di post e tutto sembra essere belle e simile a quello che ho.
    • cerchiamo di continuare questa discussione in chat
    • il problema è che la libreria jersey-jason mancava! Grazie.
    • dove è il pom.xml si trova il file, ho trovato intorno alle 8 quando faccio una ricerca nella cartella si prega di aiutare
    • hai fatto a scaricare il progetto di esempio?
    • No. ho scaricato mulesoft.com/ty/dl/studio-linux e ho cercato un esempio blog.raml.org/mocking-service-walkthrough. ma hanno lo stesso messaggio di errore. messaggio = “Unsupported media type”; quando ho accesso da dispositivo ios è sempre quando il browser si sta lavorando bene.
    • pom.xml è specifico per il codice java. iOs non fa uso di java. Questa domanda è in java.
    • Risolto il problema da questo link stackoverflow.com/questions/19396696/… dal ios parte, dobbiamo menzionare Fare il Content-Type “application/json;odata=verbose” nel tuo POST di richiesta
    • Avete risolto questo problema? Mi sono imbattuto in una sola.
    • molto utile la descrizione del problema è disponibile presso ev9d9.blogspot.de/2013/05/doing-json-on-cxf.html

  2. 127

    Aggiungere Content-Type: application/json e Accept: application/json
    nel RESTO del Client sezione di intestazione

    • Dov’è il RESTO del Client sezione di intestazione?
    • se si sta utilizzando curl chiamata da linea di comando, quindi è possibile aggiungere l’intestazione come segue: [$> curl-H “Content-Type: application/json” -X POST -d ‘{“nome”:”mio_nome”,”password”:”123456″}’ localhost:8080/url]
    • Bisogno del vostro aiuto, sono nuovo in questo resto la creazione di api, dov’è l’EST Client intestazione di sezione si trova?
    • Per chi ha raggiunto qui da un’altra lingua, e che il linguaggio è stato Ruby e si sta utilizzando resto-client, questa risposta mi ha aiutato di più di una tonnellata. Esempio di utilizzo 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"}
    • Mi ha aiutato il Python come bene. Ricordarsi di passare il payload come JSON: requests.post("/login", data = json.dumps(loginCredentials), headers = {"Content-Type": "application/json", "Accept": "application/json"})
    • risposta precisa. Ha salvato il mio tempo.
    • sarebbe utile se si potrebbe postare un esempio di codice di come questo viene fatto nel contesto della domanda.
    • Se “Content-Type”:”application/json” non aiuta, provare “Content-Type”:”text/xml”
    • Il mio problema non aveva nulla a che fare con JAXRS – stavo cercando di fare a mano una richiesta e il client di intestazione non c’era. Questa risposta è per me.

  3. 14

    Solo nel caso in cui questo è utile per gli altri, ecco il mio aneddoto:

    Ho trovato questo thread come risultato di un problema che ho incontrato mentre ero con Postino per inviare i dati di test per il mio RESTEasy server, dove – dopo una significativa modifica del codice – mi è stato sempre nulla, ma 415 Unsupported Media Type errori.

    Lunga storia breve, ho strappato tutto, alla fine ho provato a eseguire il trivial file caricati esempio sapevo lavorato; non l’ha fatto. Questo è quando ho capito che il problema è con il mio Postino richiesta. Io di solito non inviare alcun header speciali, ma in una precedente prova avevo aggiunto un “Content-Type”: “application/json” intestazione. NATURALMENTE, stavo cercando di caricare “multipart/form-data”. La rimozione risolto il mio problema.

    Morale: Controllare le intestazioni prima di saltare in aria il mondo. 😉

    • +1 per la consulenza di “assicurarsi che l’apparecchio non è collegato”. Appena avuto questo stesso problema ed è facile notare che quando si sono convinti che il problema è nel codice.
    • Hai salvato la mia giornata.
  4. 3

    Ho avuto questo problema e ha trovato che il problema era che non avevo registrato il JacksonFeature classe:

    //Create JAX-RS application.
    final Application application = new ResourceConfig()
        ...
        .register(JacksonFeature.class);

    Senza fare questa applicazione non sanno come convertire il JSON per un oggetto java.

    https://jersey.java.net/documentation/latest/media.html#json.jackson

    • puoi spiegare un po ‘ di più? Ho quasi provato di tutto, e penso che mi manca a questo punto. dove devo fare questa registrazione? Grazie
    • Grazie mille, mi sono imbattuto in questo durante l’avvio di un grizzly server. Quando iniziato da IDE o mvn:exec tutto correttamente, ma non quando si utilizza un vaso con le dipendenze. Hai fatto la mia giornata sir !
  5. 1

    Ho avuto lo stesso problema:

    curl-v -H “Content-Type: application/json” -X METTERE -d ‘{“name”:”json”,”surname”:”gson”,”married”: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

    Ho risolto con l’aggiunta di dipendenza pom.xml come segue. Si prega di provare.

        <dependency>
            <groupId>com.owlike</groupId>
            <artifactId>genson</artifactId>
            <version>0.98</version>
        </dependency>
  6. 1

    Ho lo stesso problema.
    Infatti, la richiesta di non raggiungere la maglia annotata metodo.
    Ho risolto il problema con l’annotazione: @Consuma(MediaType.APPLICATION_FORM_URLENCODED)
    L’annotazione @Consuma(“/“) non funziona!

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

    Non restituiscono Stringhe nei vostri metodi, ma gli oggetti di Cliente è di per sé, e lasciare che JAXB prendersi cura di de/serializzazione.

    • Potrebbe essere, ma credo che qui il problema è davanti, non sto colpendo il servizio.
  8. 0

    Ho avuto lo stesso problema, come è stato dare errore-415-non supportato-media-tipo di mentre colpisce post chiamata utilizzando json, mentre ho già avuto

    @Consumes(MediaType.APPLICATION_JSON) 

    e intestazioni di richiesta, come nel mio restful web service utilizzando Jersey 2.0+

    Accept:application/json
    Content-Type:application/json

    Ho risolto questo problema, aggiungendo i seguenti dipendenze per il mio progetto

    <dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.25</version>
    </dependency>

    questo aggiungerà seguenti vasi libreria :

    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

    Spero che funziona per gli altri, come ha fatto per me.

  9. 0

    solo modificare il tipo di contenuto application/json quando si utilizza JSON con POST/PUT, ecc…

  10. 0

    Nel caso In cui si sta tentando di utilizzare l’ARC app da google e scrivi un XML e ricevi questo errore, poi prova a cambiare il corpo tipo di contenuto per application/xml. Esempio qui

Lascia un commento