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.

¿Fue útil?

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

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í:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top