Wie erhalte ich mit Jersey den vollständigen REST-Anforderungstext?
Lesezeit: 4 Minuten
Markus Leon
Wie kann man den vollständigen HTTP-REST-Anforderungstext für a POST Anfrage mit Jersey?
In unserem Fall sind die Daten XML. Die Größe variiert zwischen 1 KB und 1 MB.
Das Dokumente scheinen darauf hinzudeuten, dass Sie verwenden sollten MessageBodyReader aber ich kann keine Beispiele sehen.
Es stellt sich heraus, dass Sie gar nicht viel tun müssen.
Siehe unten – der Parameter x enthält den vollständigen HTTP-Body (in unserem Fall XML).
@POST
public Response go(String x) throws IOException {
...
}
Das Hinzufügen eines @Consumes(MediaType.TEXT_PLAIN) war auch für mich erforderlich.
– Adam A
4. Juli 2011 um 1:52 Uhr
Oder würde ich raten, @Consumes irgendetwas im Allgemeinen?
– Adam A
4. Juli 2011 um 1:53 Uhr
Dies ist äußerst hilfreich zum Debuggen von Nachrichten in Jersey, wo aus welchen Gründen auch immer eine Netzwerkinspektion keine Option ist, aber Codeänderungen (in meinem Fall lokale Integrationstests).
– Patrick
7. Januar 2013 um 17:41 Uhr
Ich erhalte folgende Fehlermeldung: Der Typ „java.lang.String“ kann nicht als Element gemarshallt werden, da ihm eine XmlRootElement-Anmerkung fehlt. Die Antwort von @sdorra hat mir geholfen: Verwenden Sie einfach org.w3c.dom.Document als Typ, nicht java.lang.String.
– koppor
15. Dezember 2013 um 21:39 Uhr
Sie könnten die Annotation @Consumes verwenden, um den vollständigen Text zu erhalten:
Notiz: Vergessen Sie nicht den Header “Content-Type: application/xml” bei der Anfrage.
Benutzer2723428
Versuchen Sie dies mit diesem einzelnen Code:
import javax.ws.rs.POST;
import javax.ws.rs.Path;
@Path("/serviceX")
public class MyClassRESTService {
@POST
@Path("/doSomething")
public void someMethod(String x) {
System.out.println(x);
// String x contains the body, you can process
// it, parse it using JAXB and so on ...
}
}
Die URL für try rest services endet …. /serviceX/doSomething
Da Sie Daten in XML übertragen, könnten Sie auch direkt von/zu Pojos (un)marshalieren.
Es scheint, dass Sie a verwenden müssten MessageBodyReader hier. Hier ist ein Beispiel mit jdom:
import org.jdom.Document;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.MediaType;
import javax.ws.rs.ext.MultivaluedMap;
import java.lang.reflect.Type;
import java.lang.annotation.Annotation;
import java.io.InputStream;
@Provider // this annotation is necessary!
@ConsumeMime("application/xml") // this is a hint to the system to only consume xml mime types
public class XMLMessageBodyReader implements MessageBodyReader<Document> {
private SAXBuilder builder = new SAXBuilder();
public boolean isReadable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) {
// check if we're requesting a jdom Document
return Document.class.isAssignableFrom(type);
}
public Document readFrom(Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) {
try {
return builder.build(entityStream);
}
catch (Exception e) {
// handle error somehow
}
}
}
Fügen Sie diese Klasse der Liste der Ressourcen hinzu, die Ihre Jersey-Bereitstellung verarbeiten wird (normalerweise über web.xml konfiguriert, denke ich). Sie können diesen Reader dann in einer Ihrer regulären Ressourcenklassen wie folgt verwenden:
@Path("/somepath") @POST
public void handleXMLData(Document doc) {
// do something with the document
}
Ich habe nicht überprüft, ob dies genau wie eingegeben funktioniert, aber das ist das Wesentliche. Mehr Lesestoff hier: