Wie kann ich komplexe Objekte als Argumente an einen RESTful Service übergeben?
Habe ich erfolgreich eingerichtet, eine schnelle Prüfung der Schaffung eines "REST-like" - service, gibt ein Objekt zu JSON serialisiert, und das war Recht einfach und schnell (basierend auf dieser Artikel).
Aber während der Rückkehr JSON-freundlich-Objekte war einfach, wie Pfirsich, ich habe noch zu sehen, alle Beispiele den Umgang mit input-Parameter sind nicht-primitive. Wie kann ich den pass in ein Komplex-Objekt als argument? Ich bin mit Apache CXF, aber Beispiele für die Verwendung von anderen frameworks, wie Jackson sind auch willkommen 🙂
Client-Seite wäre wahrscheinlich so etwas wie ein javascript-Objekt, übergeben Sie es in JSON.stringify(complexObj), und übergeben Sie die Zeichenfolge als Parameter.
Den service würde wahrscheinlich so Aussehen
@Service("myService")
class RestService {
@GET
@Produces("application/json")
@Path("/fooBar")
public Result fooBar(@QueryParam("foo") double foo, @QueryParam("bar") double bar,
@QueryParam("object") MyComplex object) throws WebServiceException {
...
}
}
Senden serialisierte Objekte als Parameter würde wahrscheinlich schnell berühren 2KB URL-beschränken, die von Internet Explorer. Würde dir empfehlen die Verwendung von POST in diesen Fällen, und würde, ich muss viel ändern in der Funktion Definitionen?
InformationsquelleAutor der Frage oligofren | 2011-05-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach dem Graben ein bisschen schnell fand ich heraus, es gibt im Grunde zwei Optionen:
Option 1
Passieren Sie ein "wrapper-Objekt", welches alle anderen Parameter an den service. Möglicherweise müssen Sie versehen diese wrapper-Klassen mit JAXB-Annotationen wie @XmlRootElement, um für diese zu arbeiten, mit dem über Bord werfen Anbieter, aber wenn Sie Jackson in der Stelle gibt es keine Notwendigkeit. Nur die Art des Inhalts, auf die richtige Art und die richtige message-body-reader aufgerufen werden.
Dies funktioniert nur für POST-Typ Dienstleistungen natürlich (AFAIK).
Beispiel
Dies ist nur ein Beispiel, das der service erwähnt die ursprüngliche Frage in eine mit einem wrapper-Objekt.
Option 2
Können Sie bieten einige spezielle string-format, packen Sie Ihre Objekte in und implementieren Sie dann entweder ein Konstruktor nehmen Sie eine Zeichenfolge, eine statische valueOf(String s) oder einer statischen fromString(String s) der Klasse, die diese Zeichenfolge und ein Objekt erstellen. Oder ganz ähnlich, erstellen Sie eine ParameterHandler, dass genau das gleiche tut.
AFAIK, nur die zweite version können Sie rufen Sie Ihre Dienste aus einem browser mit JSONP (seit JSONP ist ein trick, eingeschränkt zu BEKOMMEN). Ich wählte diesen Weg, um in der Lage sein, arrays zu übergeben, um komplexe Objekte in der URI.
Als ein Beispiel, wie dies funktioniert, nehmen Sie die folgenden domain-Klasse und-service
Beispiel
URI
http://my-server.com/myService?a={"foo":1, "bar":2}&a={"foo":100, "bar":200}
würde in diesem Fall deserialisiert werden in ein array, bestehend aus zwei MyClass-Objekte.InformationsquelleAutor der Antwort oligofren
die beste und einfachste Lösung ist, senden Sie Ihre Objekt als json-string und im server-Seite implementieren Sie eine Methode, die decode json und anzeigen für das angegebene Objekt je nach Ihrem Bedarf.. und ja, es ist besser, verwenden Sie den POST.
InformationsquelleAutor der Antwort Koustuv Ganguly
Akzeptierte Antwort fehlt @BeanParam. Sehen
https://docs.jboss.org/resteasy/docs/3.0-rc-1/javadocs/javax/ws/rs/BeanParam.html
für weitere details. Es erlaubt die Definition query params innerhalb einer wrapper-Objekt.
E. g.
InformationsquelleAutor der Antwort r_ganaus