2009-11-12 8 views
46

जर्सी का उपयोग कर POST अनुरोध के लिए एक पूर्ण HTTP आरईएसटी अनुरोध निकाय कैसे प्राप्त कर सकता है?जर्सी का उपयोग कर पूर्ण आरईएसटी अनुरोध निकाय कैसे प्राप्त करें?

हमारे मामले में डेटा एक्सएमएल होगा। आकार 1 के से 1 एमबी तक भिन्न होगा।

docs इंगित करता है कि आपको MessageBodyReader का उपयोग करना चाहिए, लेकिन मुझे कोई उदाहरण नहीं दिख रहा है।

उत्तर

71

बाहर कर देता है आप में ज़्यादा कुछ करने के लिए नहीं है।

नीचे देखें - पैरामीटर x में पूर्ण HTTP निकाय होगा (जो हमारे मामले में एक्सएमएल है)।

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

एक @Consumes (MediaType.TEXT_PLAIN) जोड़ना था मेरे लिए भी जरूरी है। –

+0

या मुझे लगता है कि सामान्य रूप से @ कंस्यूम्स कुछ भी होगा? –

+0

यह जर्सी में संदेशों को डीबग करने के लिए बेहद सहायक है, जहां भी किसी भी कारण से, नेटवर्क निरीक्षण एक विकल्प नहीं है, लेकिन कोड परिवर्तन (मेरे मामले में स्थानीय एकीकरण परीक्षण) हैं। – Patrick

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

नोट: मत भूलना "सामग्री प्रकार: application/xml" अनुरोध के द्वारा हैडर।

5

चूंकि आप एक्सएमएल में डेटा स्थानांतरित कर रहे हैं, तो आप सीधे (un) मार्शल से सीधे/pojos भी कर सकते हैं। JAXB एनोटेशन के साथ

POJO:

एक उदाहरण (और अधिक जानकारी) jersey user guide, जिसे मैंने यहां कॉपी में नहीं है

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

    } 
} 

कोशिश बाकी सेवाओं के लिए यूआरएल समाप्त ..../serviceX/DoSomething

संबंधित मुद्दे