Servicio web REST que acepta una POST utilizando Restlet - Best Practice
-
22-07-2019 - |
Pregunta
Tengo mi recurso y su método típico anulado para manejar solicitudes POST.
public void acceptRepresentation(Representation rep) {
if (MediaType.APPLICATION_XML.equals(rep.getMediaType())) {
//Do stuff here
}
else {
//complain!
}
}
Lo que quiero saber es la mejor práctica para manejar mi paquete de XML. Veo muchos ejemplos usando un Formulario, pero seguramente hay una manera de trabajar con el objeto Representation en sí mismo o convertirlo en algún objeto XML útil ???
Se agradece cualquier ayuda sobre cómo debe analizar y analizar XML entrante en su recurso.
Solución
Este es más el tipo de respuesta que estaba buscando. Gracias a Thierry Boileau por la respuesta:
Puede usar dos tipos de " XML representaciones '': DomRepresentation y SaxRepresentation. Usted puede instanciar a ambos con el Representación publicada. P.ej.: DomRepresentation xmlRep = nuevo DomRepresentation (rep);
La representación Dom le da acceso al documento Dom. los SaxRepresentation te permite analizar el documento XML con el tuyo contentHandler. Mira los javadocs aquí 1 y aquí 2.
Otros consejos
Actualmente hacemos esto usando RESTeasy, que es una implementación alternativa de JAX-RS. Utilizamos enlaces JAXB (anotaciones) para mapear entre el XML y nuestros POJO modelo, y especificamos un proveedor JAXB a JAX-RS para que sepa cómo hacerlo. Esto se describe en nuestro RESTful Servicios web en Java EE con el artículo RESTEasy (JAX-RS) , que puede ayudar.
Actualización: para Restlet, el JAXB la extensión podría ser lo que necesita.
A través del método rendering.getText ()
, puede obtener una cadena que se puede alimentar a un analizador SAX o lector de dom.
@Simon E
No entiendo: ¿qué implementación REST para Java está utilizando?
Entonces, solo les doy un ejemplo del uso de JAX-RS (implementación de Jersey)
La parte del servidor (método de alguna clase REST):
@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();
}
La parte del cliente (método de alguna prueba JUnit):
@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);
}
¡Eso es todo!
En caso de que tenga problemas con las importaciones:
El servidor necesita javax.ws.rs. * Y javax.ws.rs.core. *
El cliente necesita com.sun.jersey.api.client. * Y
com.sun.jersey.api.representation. *
De cualquier manera, te daría el consejo de usar JAX-RS en lugar de implementaciones alternativas, porque JAX-RS será parte de la próximo Java EE 6
¿Es este el mismo procedimiento incluso en restlet 2.0 ??
Uso restlet 2.0m6 y aquí está el fragmento de código que uso -
@Post
Proceso de representación pública (entidad de representación)
{
prueba
{
DomRepresentation dom = nueva DomRepresentation (entidad);
Documento d = dom.getDocument ();
.
.
} catch (Excepción e)
{e.printStackTrace (); }
y arroja una excepción de puntero nulo en la línea dom.getDocument (). Lo que significa que en realidad no llegaron datos.
Y mi bit flexible se ve así: servicio var: HTTPService = new HTTPService (); service.method = " POST " ;; service.contentType = " application / xml " service.url = url; token var: AsyncToken = service.send (params);
donde params es un objeto XML.