REST Web-Service eine POST Restlet akzeptieren - Best Practice
-
22-07-2019 - |
Frage
Ich habe meine Ressource und sie typische überschriebene Methode zur POST-Anfragen bearbeiten.
public void acceptRepresentation(Representation rep) {
if (MediaType.APPLICATION_XML.equals(rep.getMediaType())) {
//Do stuff here
}
else {
//complain!
}
}
Was ich möchte wissen, ist die beste Praxis meines Paket von XML zu behandeln. Ich sehe eine Menge von Beispielen ein Formular verwenden - aber sicher gibt es einen Weg, sich mit der Vertretung Objekt zu arbeiten oder es einige nützliche XML-Objekt umgewandelt ???
Jede Hilfe, wie sollten Sie und eingehende XML Sie analysieren in Ihrer Ressource wird sehr geschätzt.
Lösung
Dies ist eher die Art von Antwort, die ich suchte. Dank Thierry Boileau für die Antwort ein:
Sie können zwei Arten von „XML verwenden Darstellungen ": DomRepresentation und SaxRepresentation. Du kannst instanziiert beide mit der geschrieben Darstellung. Z.B.: DomRepresentation xmlRep = new DomRepresentation (rep);
Die DomRepresentation gibt Ihnen Zugang zum Dom Dokument. Das SaxRepresentation ermöglicht es Ihnen, zu analysieren das XML-Dokument mit Ihrem eigenen Content. Siehe die javadocs hier 1 und hier 2.
Andere Tipps
Wir tun dies derzeit mit Resteasy, die eine Alternative JAX-RS-Implementierung ist. Wir verwenden JAXB Bindungen (Anmerkungen) zwischen dem XML und unser Modell POJOs auf der Karte, und geben Sie einen JAXB Anbieter zu JAX-RS, damit es weiß, wie. Dies ist in unserer RESTful rel="nofollow Web Services in Java EE mit Resteasy (JAX-RS) Artikel , die helfen können.
Update: für Restlet, die JAXB Erweiterung könnte sein, was Sie brauchen.
Durch die representation.getText()
Methode können Sie einen String erhalten, die in einen SAX-Parser oder dom Leser zugeführt werden kann.
@ Simon E
Ich verstehe nicht: die REST-Implementierung für Java werden Sie mit
?Also, ich gebe Ihnen nur ein Beispiel unter Verwendung von JAX-RS (Jersey-Implementierung)
Der Serverteil (Methode einiger REST-Klasse):
@POST
@Path("/upload")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
public static Response upload(
@FormParam("name") String name,
@FormParam("content") String content)
throws Exception {
// NOTE: you get your content as String
// (do something here)
return Response.ok().build();
}
Der Client-Teil (Methode einiger JUnit-Test):
@Test
public void uploadFile()
throws Exception {
String address = "http://0.0.0.0:8000/r/upload";
WebResource r = Client.create().resource(address);
Form form = new Form();
form.add("name", "test");
form.add("content", "SOME CONTENT GOES HERE");
String s = r.post(String.class, form);
System.out.println(s);
}
Das ist es !!!
Falls Sie Probleme mit Importen:
Server benötigt javax.ws.rs. * Und javax.ws.rs.core. *
Client benötigt com.sun.jersey.api.client. * Und
com.sun.jersey.api.representation. *
Auf jeden Fall würde ich Ihnen den Rat JAX-RS zu verwenden, anstatt alternative Implementierungen, weil JAX-RS Teil der sein wird, kommender Java EE 6
Ist dies das gleiche Verfahren auch in Restlet 2.0 ??
Ich verwende Restlet 2.0m6 und hier ist der Code-Schnipsel, die ich verwende -
@Post
öffentliche Darstellung Prozess (Darstellung Einheit)
{
Versuch
{
DomRepresentation dom = new DomRepresentation (Einheit);
Dokument d = dom.getDocument ();
.
.
} catch (Exception e)
{e.printStackTrace (); }
und es wirft eine Null-Zeiger-Ausnahme an der dom.getDocument () Linie. Was bedeutet eigentlich kamen keine Daten vor.
Und meine flex Bit sieht wie folgt aus - var Service: Http = new Httpservice (); service.method = "POST"; service.contentType = "application / xml" service.url = url; var token: AsyncToken = service.send (params);
wo params ist ein XML-Objekt.