Ich bin eigentlich neu bei REST WS, aber das verstehe ich wirklich nicht 415 Unsupported Media Type
.
Ich teste mein REST mit Poster auf Firefox und das GET
funktioniert gut für mich, auch das POST
(wenn es ein ist application/xml
), aber wenn ich es versuche application/json
, erreicht es das WS überhaupt nicht, der Server lehnt es ab.
Dies ist meine URL: http: // localhost: 8081 / RestDemo / services / customers / add
Das JSON
sende ich:{"name": "test1", "address" :"test2"}
Das XML
sende ich:
<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;
}
}
Customer
Klasse aus? Welche JAXB-Annotationen verwenden Sie darauf?Antworten:
Das Problem liegt in der Deserialisierung des Bean-Kunden. Ihre Programme wissen, wie es in XML gemacht wird, mit JAXB, wie Daniel schreibt, aber höchstwahrscheinlich wissen sie 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/
Das gleiche gilt für Jersey: http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/
quelle
Hinzufügen
Content-Type: application/json
undAccept: application/json
im REST-Client-Header-Bereichquelle
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"}
requests.post("/login", data = json.dumps(loginCredentials), headers = {"Content-Type": "application/json", "Accept": "application/json"})
Nur für den Fall, dass dies für andere hilfreich ist, hier meine Anekdote:
Ich habe diesen Thread als Ergebnis eines Problems gefunden, auf das ich gestoßen bin, als ich Postman zum Senden von Testdaten an meinen RESTEasy-Server verwendet habe. Nach einer wesentlichen Codeänderung wurden nur 415 nicht unterstützte Medientypfehler angezeigt.
Kurz gesagt, ich habe alles herausgerissen und schließlich versucht, das triviale Beispiel für das Hochladen von Dateien auszuführen, von dem ich wusste, dass es funktioniert. es tat es nicht. Da wurde mir klar, dass das Problem bei meiner Postbotenanfrage lag. 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, "mehrteilige / Formulardaten" hochzuladen. Das Entfernen löste mein Problem.
Moral: Überprüfen Sie Ihre Überschriften, bevor Sie Ihre Welt in die Luft jagen. ;)
quelle
Ich hatte dieses Problem und stellte fest, dass das Problem darin bestand, dass ich die JacksonFeature-Klasse nicht registriert hatte:
// Create JAX-RS application. final Application application = new ResourceConfig() ... .register(JacksonFeature.class);
Ohne dies zu tun, kann Ihre Anwendung den JSON nicht in ein Java-Objekt konvertieren.
https://jersey.java.net/documentation/latest/media.html#json.jackson
quelle
Ich hatte das gleiche Problem:
* 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 wie folgt zu pom.xml hinzugefügt habe. Versuch es bitte.
<dependency> <groupId>com.owlike</groupId> <artifactId>genson</artifactId> <version>0.98</version> </dependency>
quelle
Ich bekomme das gleiche Problem. Tatsächlich erreichte die Anfrage nicht die mit Trikot annotierte Methode. Ich habe das Problem mit dem Hinzufügen der Anmerkung gelöst: @Consumes (MediaType.APPLICATION_FORM_URLENCODED) Die Anmerkung @Consumes (" / ") funktioniert nicht!
@Path("/"+PropertiesHabilitation.KEY_EstNouvelleGH) @POST //@Consumes("*/*") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public void get__EstNouvelleGH( @Context HttpServletResponse response) { ... }
quelle
Geben Sie in Ihren Methoden keine Strings zurück, aber der Kunde widerspricht sich selbst und lässt JAXB die De- / Serialisierung übernehmen.
quelle
Ich hatte das gleiche Problem, da es den Fehler-415-nicht unterstützten Medientyp gab, während ich mit json auf einen Post-Call traf, während ich bereits den hatte
@Consumes(MediaType.APPLICATION_JSON)
und fordern Sie Header wie in meinem erholsamen Webdienst mit Jersey 2.0+ an
Ich habe dieses Problem behoben, indem ich meinem Projekt folgende 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:
Ich hoffe, dass es auch für andere funktioniert, so wie es für mich getan hat.
quelle
Ändern Sie einfach den Inhaltstyp in application / json, wenn Sie JSON mit POST / PUT usw. verwenden.
quelle
Wenn Sie versuchen, die ARC-App von Google zu verwenden und eine zu posten,
XML
und diese Fehlermeldung angezeigt wird, ändern Sie den Inhaltstyp des Körpers inapplication/xml
. Beispiel hierquelle
Ich habe das gleiche Problem beim Postboten festgestellt. Ich habe im Header-Abschnitt Akzeptieren ausgewählt und den Wert als "application / json" angegeben. Also habe ich den Inhaltstyp deaktiviert und ausgewählt und den Wert als "application / json" angegeben. Das hat funktioniert!
quelle
Ich hatte ein ähnliches Problem bei der Verwendung im Postboten. Für POST-Anforderungen im Header-Bereich fügen Sie diese als hinzu
Schlüssel: Wertpaar
Inhaltstyp: application / json Akzeptieren: application / json
ich hoffe, dass es funktionieren wird.
quelle
Wenn keine der Lösungen funktioniert hat und Sie mit JAXB arbeiten, müssen Sie Ihre Klasse mit Anmerkungen versehen
@XmlRootElement
, um dies zu vermeiden415 unsupported media type
quelle