Ich habe einen REST Webservice mit Jax-Rs und Jersey erstellt, der JSON für eine POST -Anforderung verwenden soll. Meine Webservice-Klasse sieht folgendermaßen aus:
@Path("/webhookservice")
public class Webhook {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response readData (Song song) {
// Prints out the song info
System.out.println("SONG INFO \n=======================");
System.out.println("songname: " + song.getSongname());
System.out.println("artist: " + song.getArtist());
// Repsonse with a HTTP 200 OK
Response response = Response.status(200).build();
return response;
}
}
Meine Liedklasse:
public class Song {
private String songname;
private String artist;
public String getSongname () { return this.songname; }
public String getArtist () { return this.artist; }
public void setSongname (String songname) { this.songname = songname; }
public void setArtist (String artist) { this.artist = artist; }
}
Meine web.xml (falls erforderlich)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://Java.Sun.com/xml/ns/javaee"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>SnapScan-Webhook</servlet-name>
<servlet-class>com.Sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.Sun.jersey.config.property.packages</param-name>
<param-value>za.co.lancet.service</param-value>
</init-param>
<init-param>
<param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SnapScan-Webhook</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Ich benutze RESTClient einen kleinen Rest-Client ... Hier ist ein Screenshot von dem, was ich sende:
Wenn ich das verschicke, erhalte ich die Fehlermeldung 415 Unsupported Media Type. Hat jemand eine Idee warum?
Sie müssen den Request-Header Content-Type: application/json
senden. Anscheinend fügt REST-Client diesen Header nicht automatisch für Sie hinzu.
Wie andere darauf hingewiesen haben, fehlt Ihnen der korrekte Header. Fügen Sie Content-Type: application/json
zu den "Headern" hinzu:
Ich hatte die gleiche 415
http Fehlerzeit vor. Ich habe einfach den Standard-No-Parameters-Konstruktor in meinen DTO-Klassen vergessen. Durch das Hinzufügen dieses Konstruktors, ähnlich wie bei JPA-Entitäten, wurde mein Problem gelöst und die Deserialisierung JSON->Object
funktioniert jetzt.
Ich bin mir nicht sicher, ob dies Ihr Fall ist, wenn Sie Ihren Code betrachten, aber es könnte für andere Leute nützlich sein, die sich hier die 415 + JSON-Ausgabe ansehen
Ich neige dazu, hinzuzufügen
@Produces({"application/json"})
zu meinen Diensten gegen die Top-Level-Klassendeklaration und überschreiben Sie sie gegebenenfalls.
z.B.
@Path("/foo")
@Produces({"application/json"})
public class FooRestService {
Obwohl es eine dumme Erfahrung sein könnte, sie mitzuteilen, werde ich sie weitergeben, falls sie jemandem den Tag rettet.
Ich hatte eine Reihe aufeinander folgender Funktionen, die erste war mit der Annotation @BodyParser.Of(BodyParser.Json.class)
. Als ich die erste Funktion kommentierte, wurde die Annotationszeile irrtümlich unkommentiert gelassen, so dass eine solche Annotation auf diese zweite Funktion angewendet wurde, die einen solchen 415-Medientypfehler zur Folge hatte
hth
Okay, es gibt Fehlercodes, die häufig während der Inhaltsverhandlung auftreten. 1) 406 - Nicht akzeptabel 2) 415 - Nicht unterstützter Medientyp
406 ist, wenn der Server den Inhaltstyp nicht akzeptiert, der unter dem ACCEPT-Header der Anforderung gesendet wird.
415 ist, dass der Client einen Inhaltstyp im Anforderungsheader sendet, und der Server lehnt daher den Ausdruck eines nicht unterstützten Medientyps direkt ab
406 überwinden - wir müssen die entsprechenden abhängigen jars einschließen, beispielsweise, ein Client möchte, dass eine XML-Eingabe vom Server verstanden wird, dann muss der Server XML-abhängige Abhängigkeiten haben.
415 - die Medientypen, die vom Server unterstützt werden, verstehen und den richtigen Medientyp im Inhaltstyp-Header der Anforderung übergeben
Möglicherweise haben Sie keinen Pfad für die API-Funktion angegeben. Sie haben nur den Ressourcenpfad in Ihrem Code angegeben.
@POST
@Path("/somepath")
@Consumes(MediaType.APPLICATION_JSON)
public Response readData (Song song) {
...
}