2013-08-06 9 views
30

किसी मोबाइल ऐप और वेब-सेवा के बीच किसी प्रकार की प्रॉक्सी होने के बाद, हम पोस्ट अनुरोध जारी करते समय प्रतिक्रिया से परेशान हैं। हमें स्थिति 200 के साथ प्रतिक्रिया प्राप्त होती है: ठीक है। लेकिन हम JSON प्रतिक्रिया निकाय को नहीं ढूंढ/निकाल सकते हैं।पोस्ट अनुरोध से JAX-RS क्लाइंट में प्रतिक्रिया निकाय

Client client = ClientBuilder.newClient(); 
    WebTarget webTarget = client.target(WEBSERVICE_BASE_LOCATION + "mobileDevices?operatorCode=KPNSCP"); 
    String jsonString = "{\"osVersion\":\"4.1\",\"apiLevel\":16,\"devicePlatform\":\"ANDROID\"}"; 
    Builder builder = webTarget.request(); 
    Response response = builder.post(Entity.json(jsonString)); 

हम जेएक्स-आरएस का उपयोग कर रहे हैं। क्या कोई सर्वर प्रतिक्रिया से JSON बॉडी (String) निकालने के लिए कुछ संकेत प्रदान कर सकता है?

+1

हमें इसे बदलना पड़ा: 'स्ट्रिंग आउटपुट = प्रतिक्रिया.readEntity (स्ट्रिंग.क्लास);' इसे काम करने के लिए। आपका बहुत बहुत धन्यवाद! – user2657714

उत्तर

82

इस प्रयास करें:

String output = response.getEntity(String.class); 

संपादित

@Martin spamer के लिए धन्यवाद है कि यह जर्सी 1.x जार के लिए ही काम करेंगे उल्लेख करने के लिए। जर्सी 2.x उपयोग

String output = response.readEntity(String.class); 
+34

यह जर्सी से केवल जैक्स 1.x के साथ काम करेगा: 2.x आगे जिस पर ओपी उपयोग कर रहा है (हम क्लाइंटबिल्डर.न्यू क्लाइंट(); के उपयोग से बता सकते हैं।)। प्रतिक्रिया 'प्रतिक्रिया.readEntity (String.class) है; ' –

+1

यह जैक्सर्स-ri-2.16 के लिए काम नहीं करता है, यहां आपको आउटपुट के रूप में' '' org.glassfish.jersey.client.HttpUrlConnector $ 2 @ 1255b1d1''' मिलता है। –

+0

धन्यवाद, मैं लंबे समय तक इसमें फंस गया क्योंकि मैं प्रतिक्रिया संदेश निकाय पढ़ने के लिए getEntity() का उपयोग कर रहा था। getEntity() केवल जर्सी 1.x और जर्सी 2.0 के साथ काम करता है प्रतिक्रिया संदेश निकालने के लिए प्रतिक्रिया.readEntity() के लिए समर्थन है। – spectre007

11

के लिए मैं सिर्फ jaxrs-ri-2.16 के लिए एक समाधान मिला - बस

String output = response.readEntity(String.class)

का उपयोग इस अपेक्षा के अनुरूप सामग्री वितरित करता है।

+10

जर्सी डेवलपर्स मुझे पागल ड्राइव करते हैं। प्रत्येक संस्करण विधियों का नामकरण और/या पूरे वर्कफ़्लो में भारी परिवर्तन होता है। यह खनिक खेल खेलना पसंद है। खरोंच से सभी खानों को खोजें। – Alfishe

+1

क्या आपको चपलता पसंद नहीं है? :) – Whimusical

4

मेरी उपयोग के मामले के लिए, पिछले जवाब से कोई भी काम क्योंकि मैं एक सर्वर साइड इकाई परीक्षण जो निम्न त्रुटि संदेश के कारण असफल रहा था Unable to Mock Glassfish Jersey Client Response Object प्रश्न में वर्णित के रूप में लिख रहा था:

java.lang.IllegalStateException: Method not supported on an outbound message. 
at org.glassfish.jersey.message.internal.OutboundJaxrsResponse.readEntity(OutboundJaxrsResponse.java:145) 
at ... 

यह अपवाद घटित कोड की निम्न पंक्ति पर:

String actJsonBody = (String) actResponse.getEntity(); 
0:

String actJsonBody = actResponse.readEntity(String.class); 

ठीक में कोड की समस्या लाइन चालू करने के लिए था

+1

getEntity स्वचालित रूप से किसी भी बैकिंग इनपुट स्ट्रीम को नहीं पढ़ेगा, इसलिए सावधान रहें। – Ben

0

मुझे एक ही समस्या थी, जो यूनिट टेस्ट कॉलिंग कोड चलाने की कोशिश कर रहा था जो readEntity का उपयोग करता है। उत्पादन कोड में getEntity का उपयोग नहीं कर सकता क्योंकि यह केवल ByteInputStream देता है और शरीर की सामग्री नहीं देता है और कोई भी तरीका नहीं है कि मैं उत्पादन कोड जोड़ रहा हूं जो केवल यूनिट परीक्षणों में हिट हो।

Response error = Response.serverError().build(); 
Response mockResponse = spy(error); 
doReturn("{jsonbody}").when(mockResponse).readEntity(String.class); 

ध्यान दें कि आप when(mockResponse.readEntity(String.class) विकल्प का उपयोग नहीं कर सकते क्योंकि है कि एक ही IllegalStateException फेंकता है:

मेरे समाधान एक प्रतिक्रिया बनाने और उसके बाद readEntity विधि बाहर उपहास करने के लिए एक Mockito जासूस इस्तेमाल किया गया।

आशा है कि इससे मदद मिलती है!

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