如何使用Jersey获取完整的REST请求体?

Mar*_*eon 60 java rest jersey

如何POST使用Jersey 获取请求的完整HTTP REST请求主体?

在我们的例子中,数据将是XML.大小从1K到1MB不等.

文件似乎表明,你应该使用MessageBodyReader,但我看不到任何的例子.

Mar*_*eon 84

事实证明,你根本不需要做太多事情.

请参阅下文 - 该参数x将包含完整的HTTP正文(在我们的示例中为XML).

@POST
public Response go(String x) throws IOException {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我也需要添加@Consumes(MediaType.TEXT_PLAIN). (7认同)

小智 17

您可以使用@Consumes注释来获取完整的正文:

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));
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:请勿忘记请求的"Content-Type:application/xml"标头.


use*_*428 14

使用以下单个代码尝试:

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 ...

    }
}
Run Code Online (Sandbox Code Playgroud)

尝试休息服务的网址结束..../serviceX/doSomething


Gle*_*nnV 10

由于您在xml中传输数据,因此您也可以(联合国)直接从/向pojos进行编组.

泽西用户指南中有一个示例(以及更多信息),我在这里复制:

POJO与JAXB注释:

@XmlRootElement
public class Planet {
    public int id;
    public String name;
    public double radius;
}
Run Code Online (Sandbox Code Playgroud)

资源:

@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);
    }

}      
Run Code Online (Sandbox Code Playgroud)

生成/消费的xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<planet>
    <id>1</id>
    <name>Earth</name>
    <radius>1.0</radius>
</planet>
Run Code Online (Sandbox Code Playgroud)