2009-11-12 53 views

回答

71

原來你不必做太多的。

請參閱下面 - 參數x將包含完整的HTTP主體(在我們的例子中是XML)。

@POST 
public Response go(String x) throws IOException { 
    ... 
} 
+5

添加@Consumes(MediaType.TEXT_PLAIN)是也是我所需要的。 – 2011-07-04 01:52:54

+0

或者我會猜測@Consumes什麼,一般? – 2011-07-04 01:53:14

+0

這對於在澤西島調試消息非常有幫助,無論出於何種原因,網絡檢查都不是一種選擇,但是代碼更改是(本地集成測試,就我而言)。 – Patrick 2013-01-07 17:41:10

0

看來你必須在這裏使用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 
} 

我還沒有驗證這個作品完全一樣類型的,但是這是它的要點。更多閱讀這裏:

14

您可以使用@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進行」 的請求頭。

5

由於您使用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> 
10

試試這個使用這個單碼:

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的

相關問題