Como llegar solicitud de cuerpo completo utilizando RESTO Jersey?
Pregunta
¿Cómo se puede obtener la solicitud de cuerpo completo HTTP REST para una solicitud POST
usando Jersey?
En nuestro caso los datos serán XML. Tamaño variaría de 1K a 1 MB.
El docs parecen indicar que debe utilizar, pero MessageBodyReader
no puedo ver ningún ejemplo.
Solución
Resulta que usted no tiene que hacer mucho en absoluto.
Ver abajo -. x
el parámetro contendrá el cuerpo HTTP completa (que es XML en nuestro caso)
@POST
public Response go(String x) throws IOException {
...
}
Otros consejos
Se puede usar los @Consumes anotación para conseguir el cuerpo completo:
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
@Path("doc")
public class BodyResource
{
@POST
@Consumes(MediaType.APPLICATION_XML)
public void post(Document doc) throws TransformerConfigurationException, TransformerException
{
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.transform(new DOMSource(doc), new StreamResult(System.out));
}
}
Nota: : No olvide el "Content-Type: application / xml". Encabezado por la petición
Prueba esta usando este código único:
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 ...
}
}
La url para los servicios de intento de descanso termina .... / ServiceX / doSomething
Puesto que usted está transfiriendo datos en XML, que también podría (des) Mariscal directamente desde / a POJOs.
Hay un ejemplo (y más info) en el usuario Jersey rel="noreferrer"> href="http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e820" guía, que copio aquí:
POJO con anotaciones JAXB:
@XmlRootElement
public class Planet {
public int id;
public String name;
public double radius;
}
Recursos:
@Path("planet")
public class Resource {
@GET
@Produces(MediaType.APPLICATION_XML)
public Planet getPlanet() {
Planet p = new Planet();
p.id = 1;
p.name = "Earth";
p.radius = 1.0;
return p;
}
@POST
@Consumes(MediaType.APPLICATION_XML)
public void setPlanet(Planet p) {
System.out.println("setPlanet " + p.name);
}
}
El XML que consigue producido / consumido:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<planet>
<id>1</id>
<name>Earth</name>
<radius>1.0</radius>
</planet>
No parece que tendría que utilizar un MessageBodyReader
aquí. He aquí un ejemplo, usando 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
}
}
}
Añadir esta clase a la lista de los recursos de la implementación Jersey procesará (normalmente configura a través de web.xml, creo). A continuación, puede utilizar este lector en una de sus clases regulares de recursos como esto:
@Path("/somepath") @POST
public void handleXMLData(Document doc) {
// do something with the document
}
No he verificado que esto funciona exactamente como se escribe, pero esa es la esencia de la misma. Más lectura aquí: