2012-11-07 30 views
14

संभव डुप्लिकेट:
HTTP GET with request bodyस्प्रिंग RestTemplate - http अनुरोध शरीर के साथ प्राप्त

मैं कुछ विचार विमर्श यहाँ पढ़ा है जो HTTP GET के माध्यम से सामग्री भेजने वकालत नहीं करते। डेटा के आकार पर प्रतिबंध हैं जिन्हें ग्राहकों (वेब ​​ब्राउज़र) के माध्यम से भेजा जा सकता है। और जीईटी डेटा को संभालने से सर्वर पर भी निर्भर करता है। कृपया नीचे दिए गए अनुभाग संसाधन देखें।

हालांकि, मुझे RestTemplate का उपयोग करके HTTP GET के माध्यम से सामग्री भेजने की संभावना का परीक्षण करने के लिए कहा गया है। मैंने वसंत मंच पर कुछ चर्चाएं की लेकिन उन्हें जवाब नहीं दिया गया। (कृपया http पोस्ट के माध्यम से डेटा भेजना ठीक है)। चर्चा here इसके बजाय POST का उपयोग करने का सुझाव देता है।

देव env - JBoss 5.1 के रूप में, वसंत 3.1.3

ग्राहक

@Test 
public void testGetWithBody() 
{ 
    // acceptable media type 
    List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>(); 
    acceptableMediaTypes.add(MediaType.TEXT_PLAIN); 

    // header 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setAccept(acceptableMediaTypes); 

    // body 
    String body = "hello world"; 
    HttpEntity<String> entity = new HttpEntity<String>(body, headers); 

    Map<String, Object> uriVariables = new HashMap<String, Object>(); 
    uriVariables.put("id", "testFile"); 

    // Send the request as GET 
    ResponseEntity<String> result = restTemplate.exchange(
      "http://localhost:8080/WebApp/test/{id}/body", 
      HttpMethod.GET, entity, String.class, uriVariables); 

    Assert.assertNotNull(result.getBody()); 
} 

सर्वर @Controller

@RequestMapping(value = "/{id}/body", method = RequestMethod.GET) 
public @ResponseBody 
String testGetWithBody(@PathVariable String id, 
     @RequestBody String bodyContent) 
{ 
    return id + bodyContent; 
} 

समस्या - इस परीक्षण को क्रियान्वित मामला 50 देता है 0 आंतरिक सर्वर त्रुटि। डिबगिंग पर, मैंने पाया कि नियंत्रक हिट नहीं हुआ है।

  1. यह समझना महत्वपूर्ण है कि RestTemplate तरह से अनुरोध निकाय के रूप में डेटा भेजने के लिए प्रदान करता है, लेकिन त्रुटि तब होती है क्योंकि सर्वर अनुरोध शरीर नहीं संभाल सकता सही है?

  2. यदि HTTP प्राप्त के माध्यम से भेजा गया अनुरोध निकाय पारंपरिक नहीं है तो RestTemplate एपीआई को इसे भेजने की अनुमति देने के लिए क्यों प्रदान करता है? क्या इसका मतलब है कि जीईटी के माध्यम से अनुरोध निकाय को संभालने में सक्षम कुछ सर्वर हैं?

संसाधन - HTTP GET के माध्यम से शरीर को भेजने वसंत मंच

http://forum.springsource.org/showthread.php?129510-Message-body-with-HTTP-GET&highlight=resttemplate+http+get

http://forum.springsource.org/showthread.php?94201-GET-method-on-RestTemplate-exchange-with-a-Body&highlight=resttemplate+http+get

resourc पर RestTemplate का उपयोग करने पर विचार विमर्श तों - HTTP के माध्यम से शरीर को भेजने पर विचार विमर्श जनरल प्राप्त

get-with-request-body

is-this-statement-correct-http-get-method-always-has-no-message-body

get-or-post-when-reading-request-body

http-uri-get-limit

+0

डुप्लिकेट के रूप में चिह्नित प्रश्नों में पोस्ट उत्तरों की अनुमति नहीं है, इसलिए मैं इसे कैसे कर सकता हूं यह जानने के लिए कि कितना समय लगता है आप RestTemplate को अपाचे http क्लाइंट पर इसका उपयोग करके शरीर के साथ अनुरोध प्राप्त कर सकते हैं कुछ ट्यूनिंग के साथ: – LifeIsGoodMF

+0

कक्षा HttpGetWithBody HttpEntityEnclosingRequestBase { HttpGetWithBody (अंतिम यूआरआई यूरी) { setURI (uri); } @ ओवरराइड सार्वजनिक स्ट्रिंग getMethod() { वापसी HttpGet.METHOD_NAME; } } – LifeIsGoodMF

+0

HttpComponentsClientHttpRequestFactory requestFactory = नए HttpComponentsClientHttpRequestFactory() { @Override संरक्षित HttpUriRequest createHttpUriRequest (HttpMethod httpMethod, यूआरआई uri) { अगर (httpMethod == HttpMethod.GET) { नई HttpGetWithBody (URI) वापसी; } वापसी super.createHttpUriRequest (httpMethod, uri); } }; – LifeIsGoodMF

उत्तर

6

यह सही समझना महत्वपूर्ण है कि RestTemplate तरीका प्रदान करता है है के रूप में डेटा भेजने के लिए अनुरोध निकाय, लेकिन त्रुटि होती है क्योंकि सर्वर अनुरोध निकाय को संभाल नहीं सकता है?

आप (अनुरोध एक अनुरोध शरीर और एक GET विधि? के साथ भेजा हो जाता है) नेटवर्क यातायात को देखकर और सर्वर लॉग में बता सकते हैं (500 आप परिणाम प्राप्त एक सर्वर साइड प्रभाव लॉग होता है कि होना आवश्यक है , और यदि नहीं, सर्वर को ऐसा करने के लिए कॉन्फ़िगर करें)।

यदि HTTP प्राप्त के माध्यम से भेजा गया अनुरोध निकाय पारंपरिक नहीं है तो RestTemplate एपीआई को इसे भेजने की अनुमति देने के लिए क्यों प्रदान करता है? क्या इसका मतलब है कि जीईटी के माध्यम से अनुरोध निकाय को संभालने में सक्षम कुछ सर्वर हैं?

क्योंकि यह एक सामान्य वर्ग है जो आपको उन अनुरोधों को तैयार करने की अनुमति देता है जिनमें संदेश निकाय शामिल हो सकता है।

HTTP GET with request body में कहा गया है:

दूसरे शब्दों में, किसी भी HTTP अनुरोध संदेश एक संदेश के मुख्य भाग को रोकने के लिए अनुमति दी है, और इस तरह [एक सर्वर] संदेशों उस के साथ दिमाग में पार्स करना होगा। हालांकि, जीईटी के लिए सर्वर सेमेन्टिक्स प्रतिबंधित हैं जैसे कि शरीर, यदि कोई है, तो अनुरोध के लिए कोई अर्थपूर्ण अर्थ नहीं है। पार्सिंग पर आवश्यकताएं विधि अर्थशास्त्र पर आवश्यकताओं से अलग हैं।

एक शरीर किसी GET पर शब्दार्थ कुछ भी नहीं कर सकते हैं, क्योंकि आप का अनुरोध एक संसाधन हैं। ऐसा लगता है कि आप सर्वर को बताते हैं: "मुझे संसाधन एक्स दें, ओह, और कुछ सेब हैं!"। सर्वर आपके सेब की परवाह नहीं करेगा और खुशी से संसाधन एक्स की सेवा करेगा - या एक त्रुटि फेंक देगा क्योंकि इसे किसी अनुरोध में कोई ऑफ़र पसंद नहीं है।

हालांकि, मैं HTTP GET के माध्यम से सामग्री भेजने के लिए संभावना का परीक्षण करने के लिए कहा गया है

कृपया एक है जो इस अनुरोध किया है कि इस एक मामले का परीक्षण किया जा करने के लिए नहीं होना चाहिए वह यह है कि बताओ, क्योंकि कोई समझदार कार्यान्वयन इसका समर्थन नहीं करता है।

+0

आपकी त्वरित प्रतिक्रिया के लिए धन्यवाद कोडकास्टर! हालांकि, POST लागू करने की विधि प्रतीत होती है, मैं लॉग को जांचने के लिए सर्वर को कॉन्फ़िगर कर दूंगा। –

+0

कभी-कभी क्वेरी पैरामीटर को जेसन ऑब्जेक्ट के रूप में लागू करना और यूआरएल के बजाय शरीर में रखना अधिक सुविधाजनक होता है। किस मामले में सर्वर सेब में रुचि रखते हैं। – nevster

+0

(जो यह नहीं कह रहा है कि यह एक अच्छा विचार है।) – nevster

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