如何使用Jersey獲取POST
請求的完整HTTP REST請求正文?如何使用Jersey獲取完整的REST請求體?
在我們的案例中,數據將是XML。大小從1K到1MB不等。
docs似乎表明您應該使用MessageBodyReader
但我看不到任何示例。
如何使用Jersey獲取POST
請求的完整HTTP REST請求正文?如何使用Jersey獲取完整的REST請求體?
在我們的案例中,數據將是XML。大小從1K到1MB不等。
docs似乎表明您應該使用MessageBodyReader
但我看不到任何示例。
原來你不必做太多的。
請參閱下面 - 參數x
將包含完整的HTTP主體(在我們的例子中是XML)。
@POST
public Response go(String x) throws IOException {
...
}
看來你必須在這裏使用MessageBodyReader
。下面是一個例子,使用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
}
}
}
這個類添加到您的資源部署的球衣將處理的列表(通常是通過web.xml中配置,我認爲)。然後,您可以在你這樣的常規資源類中的一個使用此閱讀:
@Path("/somepath") @POST
public void handleXMLData(Document doc) {
// do something with the document
}
我還沒有驗證這個作品完全一樣類型的,但是這是它的要點。更多閱讀這裏:
您可以使用@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));
}
}
注意:不要忘記 「的Content-Type:application/xml進行」 的請求頭。
由於您使用xml傳輸數據,因此您也可以直接從/到pojos進行編組。
有一個在jersey user guide,我複製到這裏的例子(詳細信息):
POJO與JAXB註釋:
@XmlRootElement
public class Planet {
public int id;
public String name;
public double radius;
}
資源:
@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);
}
}
生成/消耗的xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<planet>
<id>1</id>
<name>Earth</name>
<radius>1.0</radius>
</planet>
試試這個使用這個單碼:
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 ...
}
}
的嘗試REST服務的URL最後.../serviceX/DoSomething的
添加@Consumes(MediaType.TEXT_PLAIN)是也是我所需要的。 – 2011-07-04 01:52:54
或者我會猜測@Consumes什麼,一般? – 2011-07-04 01:53:14
這對於在澤西島調試消息非常有幫助,無論出於何種原因,網絡檢查都不是一種選擇,但是代碼更改是(本地集成測試,就我而言)。 – Patrick 2013-01-07 17:41:10