2009-05-13 15 views
11

का उपयोग कर एक PUT अनुरोध से पैरामीटर प्राप्त करने के लिए कोशिश कर रहा HttpServlet # doPut:सर्वलेट मापदंडों और doPut

public void doPut(HttpServletRequest request, HttpServletResponse response) { 
    String name = request.getParameter("name"); 
    // name is null 
} 

अनुरोध भेजने के लिए कर्ल का उपयोग करना:

curl -X PUT \ 
     --data "name=batman" \ 
     --header "Content-Type: text/plain" http://localhost:8080/sample.html 

doGet उपयोग करने के साथ ठीक काम करता है और कर्ल अनुरोध प्राप्त । क्या मैं कुछ भूल रहा हूँ?

उत्तर

20

टिप्पणियों और आगे अनुसंधान के आधार पर मैंने महसूस किया कि सर्वलेट कुछ भी कल्पना नहीं कर सकते डेटा सर्वर पर डाल दिया है और इसलिए किया जा रहा बारे में, नाम/मान युग्म पार्स नहीं होंगे।

निम्नलिखित समाधान PUT के माध्यम से पारित किसी भी डेटा को संभालने का उचित तरीका प्रतीत होता है, और एक्सएमएल, नाम/मूल्य, या जो भी हो, के रूप में पार्स किया जा सकता है।

BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream()); 

String data = br.readLine(); 
+0

आप इसका उपयोग क्यों नहीं कर रहे हैं इसका मतलब यह नहीं है? हालांकि आप कृपया इस चीज़ के साथ खेल सकते हैं। –

+4

मैं एक ही समस्या में भाग रहा हूं: मैं एक restfull सेवा को लागू करने की कोशिश कर रहा हूँ, PUT संसाधन को बदलने के लिए है। जेटी अनुरोध पैरामीटर मैप में उपलब्ध सभी डेटा बनाता है, टोमकैट हालांकि नहीं .. – Andrej

+0

जावा वेब सर्विसेज के अनुसार: ऊपर और चल रहा है, "डूपोस्ट और डूपट काफी भिन्न हैं क्योंकि सर्वलेट कंटेनर रनटाइम एक उपयोगी पैरामीटर मैप उत्पन्न नहीं करता है। (यह टॉमकैट और जेटी दोनों में मामला है) " – Jason

1

doPut() से आपका क्या मतलब है? जहां तक ​​मुझे पता है, यह doGet() या doPost() की तरह काम नहीं करता है, जहां आपके पास अनुरोध पैरामीटर और सामान हैं।

PUT का उपयोग सर्वर पर कुछ डालने के लिए किया जा सकता है। विशेष रूप से, PUT ऑपरेशन क्लाइंट को सर्वर पर फ़ाइल रखने की अनुमति देता है और एफ़टीपी द्वारा फाइल भेजने के समान होता है। इस उदाहरण को देखें, मैंने जेगुरु पर पाया।

->GET /file.dat HTTP/1.1 

<-HTTP/1.1 404 Not Found 

->PUT /file.dat HTTP/1.1 
Content-Length: 6 
Content-Type: text/plain 

Hello! 

<-HTTP/1.1 200 OK 

->GET /file.dat HTTP/1.1 

<-HTTP/1.1 200 OK 
Content-Length: 6 
Content-Type: text/plain 

Hello! 
0

doGet() और doPost() तरीकों में विपरीत, हम doPut() और doDelete() तरीकों में getParameter() पद्धति का उपयोग करके अनुरोध पैरामीटर प्राप्त करने में सक्षम नहीं हैं। हमें उन्हें इनपुट स्ट्रीम से मैन्युअल रूप से पुनर्प्राप्त करने की आवश्यकता है।

निम्न विधि अनुरोध पैरामीटर प्राप्त करता है और किसी नक्शे में उन्हें रिटर्न:

public static Map<String, String> getParameterMap(HttpServletRequest request) { 

    BufferedReader br = null; 
    Map<String, String> dataMap = null; 

    try { 

     InputStreamReader reader = new InputStreamReader(
       request.getInputStream()); 
     br = new BufferedReader(reader); 

     String data = br.readLine(); 

     dataMap = Splitter.on('&') 
       .trimResults() 
       .withKeyValueSeparator(
         Splitter.on('=') 
         .limit(2) 
         .trimResults()) 
       .split(data); 

     return dataMap; 
    } catch (IOException ex) { 
     Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex); 
    } finally { 
     if (br != null) { 
      try { 
       br.close(); 
      } catch (IOException ex) { 
       Logger.getLogger(Utils.class.getName()).log(Level.WARNING, null, ex); 
      } 
     } 
    } 

    return dataMap; 
} 

उदाहरण पैरामीटर पार्स करने में गूगल के अमरूद पुस्तकालय उपयोग करता है। doGet(), doPost(), doPut() और doDelete() विधियों वाले एक पूर्ण उदाहरण के लिए, आप मेरे Using jsGrid tutorial पढ़ सकते हैं।

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