Meine POST-Methode sieht folgendermaßen aus:
@POST
@Consumes({"application/json"})
@Path("create/")
public void create(String param1, String param2){
System.out.println("param1 = " + param1);
System.out.println("param2 = " + param2);
}
Wenn ich einen Jersey-Client in Netbeans erstelle, sieht die Methode, die die Post-Methode aufruft, folgendermaßen aus:
public void create(Object requestEntity){
webResource.path("create").type(MediaType.APPLICATION_JSON).post(requestEntity);
}
Wenn Sie diesen Test ausführen:
@Test
public void hello(){
String json = "{param1=\"hello\",param2=\"hello2\"}";
this.client.create(json);
}
Es gibt die folgende Ausgabe auf dem Server:
INFO: param1 = {param1="hello",param2="hello2"}
INFO: param2 =
Was muss ich ändern, damit die Parameter den richtigen Wert ergeben?
Antworten:
Ihre
@POST
Methode sollte ein JSON-Objekt anstelle einer Zeichenfolge akzeptieren. Jersey verwendet JAXB, um das Marshalling und Unmarshaling von JSON-Objekten zu unterstützen ( Einzelheiten finden Sie in den Trikotdokumenten ). Erstellen Sie eine Klasse wie:Dann würde Ihre
@POST
Methode wie folgt aussehen:Diese Methode erwartet, dass das JSON-Objekt als Hauptteil des HTTP-POST empfangen wird. JAX-RS übergibt den Inhaltskörper der HTTP-Nachricht als nicht kommentierten Parameter -
input
in diesem Fall. Die eigentliche Nachricht würde ungefähr so aussehen:Die Verwendung von JSON auf diese Weise ist aus offensichtlichen Gründen weit verbreitet. Wenn Sie es jedoch in etwas anderem als JavaScript generieren oder verwenden, müssen Sie vorsichtig sein, um den Daten ordnungsgemäß zu entkommen. In JAX-RS würden Sie einen MessageBodyReader und einen MessageBodyWriter verwenden , um dies zu implementieren. Ich glaube, dass Jersey bereits Implementierungen für die erforderlichen Typen (z. B. Java-Grundelemente und JAXB-umhüllte Klassen) sowie für JSON hat. JAX-RS unterstützt eine Reihe anderer Methoden zum Übergeben von Daten. Diese erfordern nicht die Erstellung einer neuen Klasse, da die Daten mithilfe einer einfachen Argumentübergabe übergeben werden.
HTML
<FORM>
Die Parameter würden mit @FormParam kommentiert :
Der Browser verschlüsselt das Formular mit "application / x-www-form-urlencoded" . Die JAX-RS-Laufzeit sorgt dafür, dass der Body dekodiert und an die Methode übergeben wird. Folgendes sollten Sie auf dem Draht sehen:
Der Inhalt ist in diesem Fall URL-codiert .
Wenn Sie die Namen der FormParam nicht kennen, können Sie Folgendes tun:
HTTP-Header
Sie können die Annotation @HeaderParam verwenden, wenn Sie Parameter über HTTP-Header übergeben möchten:
So würde die HTTP-Nachricht aussehen. Beachten Sie, dass dieser POST keinen Body hat.
Ich würde diese Methode nicht für die allgemeine Parameterübergabe verwenden. Dies ist sehr praktisch, wenn Sie auf den Wert eines bestimmten HTTP-Headers zugreifen müssen.
HTTP-Abfrageparameter
Diese Methode wird hauptsächlich bei HTTP-GETs verwendet, gilt jedoch auch für POSTs. Es wird die Annotation @QueryParam verwendet .
Wie bei der vorherigen Technik ist für die Übergabe von Parametern über die Abfragezeichenfolge kein Nachrichtentext erforderlich. Hier ist die HTTP-Nachricht:
Sie müssen besonders vorsichtig sein, um die Abfrageparameter auf der Clientseite ordnungsgemäß zu codieren . Die Verwendung von Abfrageparametern kann aufgrund von URL-Längenbeschränkungen, die von einigen Proxys erzwungen werden, sowie Problemen bei der Codierung problematisch sein.
HTTP-Pfadparameter
Pfadparameter ähneln Abfrageparametern, sind jedoch in den HTTP-Ressourcenpfad eingebettet. Diese Methode scheint heute zu sprechen. Es gibt Auswirkungen in Bezug auf das HTTP-Caching, da der Pfad die HTTP-Ressource wirklich definiert. Der Code sieht etwas anders aus als die anderen, da die Annotation @Path geändert wurde und @PathParam verwendet wird :
Die Nachricht ähnelt der Version der Abfrageparameter, außer dass die Namen der Parameter an keiner Stelle in der Nachricht enthalten sind.
Diese Methode hat dieselben Codierungsprobleme wie die Version des Abfrageparameters. Pfadsegmente sind unterschiedlich codiert, daher müssen Sie auch dort vorsichtig sein.
Wie Sie sehen können, hat jede Methode Vor- und Nachteile. Die Wahl wird normalerweise von Ihren Kunden entschieden. Wenn Sie
FORM
HTML-Seiten auf Basis bereitstellen, verwenden Sie@FormParam
. Wenn Ihre Clients auf JavaScript + HTML5 basieren, möchten Sie wahrscheinlich JAXB-basierte Serialisierungs- und JSON-Objekte verwenden. DieMessageBodyReader/Writer
Implementierungen sollten sich um das notwendige Entkommen für Sie kümmern, damit eine Sache weniger schief gehen kann. Wenn Ihr Client Java-basiert ist, aber keinen guten XML-Prozessor hat (z. B. Android), würde ich wahrscheinlich dieFORM
Codierung verwenden , da ein Inhaltskörper einfacher zu generieren und ordnungsgemäß zu codieren ist als URLs. Hoffentlich beleuchtet dieser Mini-Wiki-Eintrag die verschiedenen Methoden, die JAX-RS unterstützt.Hinweis: Im Interesse einer vollständigen Offenlegung habe ich diese Funktion von Jersey noch nicht verwendet. Wir haben daran herumgebastelt, da wir eine Reihe von JAXB + JAX-RS-Anwendungen bereitgestellt haben und in den mobilen Client-Bereich ziehen. JSON passt viel besser als XML auf HTML5- oder jQuery-basierte Lösungen.
quelle