it-swarm.com.de

Fehler 415 Nicht unterstützter Medientyp: POST nicht erreichen REST wenn JSON, aber wenn XML

Ich bin eigentlich neu in REST WS, aber ich verstehe diesen 415 Unsupported Media Type nicht. 

Ich teste mein REST mit Poster auf Firefox und die GET funktioniert gut für mich, auch die POST (wenn es ein application/xml ist), aber wenn ich application/json versuche, wird der WS überhaupt nicht erreicht, der Server lehnt ihn ab .

Dies ist meine URL: http: // localhost: 8081/RestDemo/services/customers/add

Dies ist JSON Ich sende: {"name": "test1", "address" :"test2"}

Dies ist XML ich sende:

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

und das ist meine Ressourcenklasse:

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

Dies ist meine Kundenklasse:

@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

Das Problem liegt in der Deserialisierung des Bohnenkunden. Ihre Programme wissen, wie es in XML geht, mit JAXB, während Daniel schreibt, aber höchstwahrscheinlich nicht, wie es in JSON geht.

Hier haben Sie ein Beispiel mit Resteasy/Jackson http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/

Dasselbe gilt für Jersey: http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

20
unludo

Fügen Sie Content-Type: application/json und Accept: application/jsonin REST Client-Header hinzu

121
Anup Awasthi

Für den Fall, dass dies für andere hilfreich ist, hier meine Anekdote:

Ich fand diesen Thread als Ergebnis eines Problems, auf das ich bei der Verwendung von Postman zum Senden von Testdaten an meinen RESTEasy-Server gestoßen war. Nach einer signifikanten Codeänderung bekam ich nur 415 nicht unterstützte Medientypfehler.

Lange Rede, kurzer Abriss, ich habe alles rausgerissen und schließlich versucht, das triviale Beispiel für das Hochladen von Dateien auszuführen, von dem ich wusste, dass es funktioniert. hat es nicht getan Da wurde mir klar, dass das Problem mit meiner Postman-Anfrage war. Normalerweise sende ich keine speziellen Header, aber in einem früheren Test hatte ich einen "Content-Type": "application/json" -Header hinzugefügt. Natürlich habe ich versucht, "multipart/form-data" hochzuladen. Durch das Entfernen wurde mein Problem behoben.

Moralisch: Überprüfen Sie Ihre Kopfzeilen, bevor Sie Ihre Welt in die Luft jagen. ;)

13
Max P Magee

Ich hatte dieses Problem und stellte fest, dass ich die JacksonFeature-Klasse nicht registriert hatte:

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

Ohne dies zu wissen, weiß Ihre Anwendung nicht, wie sie den JSON in ein Java-Objekt konvertieren soll. 

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

3
David Hopkins

Ich hatte das gleiche Problem: 

curl -v -H "Inhaltstyp: application/json" -X PUT -d '{"name": "json", "Nachname": "gson", "verheiratet": wahr, "alter": 32, " Gehalt ": 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

Ich habe es gelöst, indem ich die Abhängigkeit zu pom.xml wie folgt hinzugefügt habe. Versuch es bitte. 

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

Ich bekomme das gleiche Problem ..__ Die Anforderung hat die benannte Jersey-Methode nicht erreicht ..__ Das Problem wurde durch Hinzufügen der Anmerkung gelöst: @Consumes (MediaType.APPLICATION_FORM_URLENCODED) Die Anmerkung @Consumes ( "/") funktionieren nicht!

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

Geben Sie keine Strings in Ihren Methoden zurück, aber der Kunde widerspricht sich selbst und überlässt JAXB die De/Serialisierung.

0
Daniel Kutik

Wenn Sie versuchen, die ARC-App von Google zu verwenden und eine XML zu posten, und diese Fehlermeldung angezeigt wird, ändern Sie den Inhaltstyp in application/xml. Beispiel hier

0
swati shilpa

Ändern Sie einfach den Inhaltstyp in application/json, wenn Sie JSON mit POST/PUT usw. verwenden.

0
Chirag

Ich hatte das gleiche Problem, da es den error-415-nicht unterstützten-medientyp gab während ich einen Post-Aufruf mit json schlug, während ich bereits den 

@Consumes(MediaType.APPLICATION_JSON) 

und Header wie in meinem Restful-Web-Service mit Jersey 2.0+ anfordern

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

Ich habe dieses Problem behoben, indem ich meinem Projekt die folgenden Abhängigkeiten hinzugefügt habe

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

dadurch werden Ihrer Bibliothek folgende Gläser hinzugefügt:

  1. jersey-media-json-jackson-2.25.jar
  2. jersey-Entity-Filterung-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

Ich hoffe, dass es auch für andere funktioniert, wie für mich.

0
Prakhar Agrawal