2009-07-29 15 views
9

क्या किसी को HttpServletRequest ऑब्जेक्ट से केवल POST पैरामीटर प्राप्त करने का कोई तरीका पता है?केवल पोस्ट पैरामीटर पुनर्प्राप्त करें (जावा)

आईई, PHP में $ _POST सुपरग्लोबल है और पर्ल का CGI.pm केवल HTTP विधि पोस्ट (डिफ़ॉल्ट रूप से) POST पैरामीटर पुनर्प्राप्त करेगा।

HttpServletRequest.getParameter (स्ट्रिंग) में URL पैरामीटर शामिल होंगे भले ही HTTP विधि पोस्ट हो।

+2

मैं यह समझ के रूप में, आप पोस्ट शरीर में केवल मापदंडों और नहीं पोस्ट URL से पैरामीटर चाहते हैं। – McDowell

+0

बिल्कुल। यह एक और सटीक वर्णन है। – dankuck

उत्तर

6

मुझे लगता है कि HttpServletRequest.getQueryString() मैन्युअल रूप से पार्स करने का एक तरीका हो सकता है और जांचें कि इसमें पैरामीटर मौजूद नहीं है।

एक अनुभवहीन कार्यान्वयन (URL- सुरक्षित कुंजी मान अनदेखी) कुछ इस तरह (untested) जाना होगा:

public boolean isInQuery(HttpServletRequest request, String key) { 
    String query = request.getQueryString(); 
    String[] nameValuePairs = query.split("&"); 
    for(String nameValuePair: nameValuePairs) { 
    if(nameValuePair.startsWith(key + "=")) { 
     return true; 
    } 
    } 
    return false; 
} 
+1

यह वास्तव में एक आसान समाधान है। फिर भी, यह एक कामकाज की तरह लगता है। मुझे आश्चर्य है कि काम करने के लिए कुछ मानक वर्ग है या नहीं। पाठकों के लिए, विधि की शुरुआत में इस पंक्ति जोड़ें: कुंजी = URLEncoder.encode (कुंजी, "UTF-8"); – dankuck

+0

आह, मुझे लगता है कि "वर्कअराउंड" गलत शब्द है। यह सिर्फ गलत लगता है क्योंकि मुझे पता है कि वहां कुछ कोड कहीं भी छिपा हुआ कोड है। – dankuck

+1

डीएफ अपाचे के एचटीपी क्लाइंट क्लास में पैरामीटर पार्सर नामक एक कक्षा का उल्लेख करता है। यह जावा की मानक लाइब्रेरी में नहीं है, लेकिन कम से कम यह उन सभी छोटी चीजों के बारे में सोचता है जो हम यहां भूल गए हैं। फिर कोड GetParameterValues ​​() के माध्यम से जा सकता है और किसी भी को अनदेखा कर सकता है जिसमें पैरामीटरपेसर.parse() द्वारा दिए गए मानों में से एक है। – dankuck

8

मेरी समझ से, वहाँ पोस्ट पैरामीटर जैसी कोई बातें हैं और HTTP में पैरामीटर मिलता है, वहाँ पोस्ट और जीईटी तरीके हैं। जब POST विधि का उपयोग करके अनुरोध किया जाता है, पैरामीटर संदेश निकाय के भीतर जाते हैं। जीईटी अनुरोध के मामले में, पैरामीटर यूआरएल में जाते हैं।

मेरा पहला विचार यह था कि यह आपके सर्वलेट कंटेनर में कार्यान्वयन बग था। लेकिन, चूंकि चीजें हमेशा की अपेक्षा नहीं होती हैं, इसलिए जावा सर्वलेट विनिर्देश (कम से कम 2.4 संस्करण) दो प्रकार के पैरामीटर के बीच अंतर नहीं करता है। इसलिए, सर्वलेट एपीआई का उपयोग कर पोस्ट या यूआरएल पैरामीटर प्राप्त करने का कोई तरीका नहीं है।

निश्चित रूप से आप पहले से ही एक योजना बी है लेकिन, सिर्फ मामले में, मैं दो विकल्प है कि मेरे मन में आए पोस्ट:

  1. आप पैरामीटर नाम परिभाषा के लिए उपयोग किया है, तो आप एक उपसर्ग इस्तेमाल कर सकते हैं जब आप GetParameterNames() परिणाम को पुन: सक्रिय करते हैं तो दोनों के बीच अंतर करने के लिए।

  2. आप यूआरएल ऑब्जेक्ट बनाने और केवल पैरामीटर प्राप्त करने के लिए getQuery() विधि का उपयोग कर यूआरएल पार्स कर सकते हैं। फिर, HttpClient लाइब्रेरी में ParameterParser जैसे कुछ उपयोगिता वर्ग का उपयोग करके क्वेरी स्ट्रिंग पर पैरामीटर को पार्स करें। और अंत में, getParameterNames() परिणाम से उन नामों को घटाएं।

+0

हम्म ... मैं सिर्फ एक कार्यान्वयन का परीक्षण कर रहा हूं (Win32 के लिए टोमकैट)। क्या आपने किसी अन्य का परीक्षण किया है? – dankuck

+1

पैरामीटर पार्सर यूआरएल पैरामीटर और मानों की पहचान करने के कार्य के लिए सही पैकेज की तरह लगता है। फिर ykaganovich के जवाब में तंत्र की तरह कुछ इस्तेमाल किया जा सकता है। – dankuck

3

तुम सिर्फ HttpServlet का एक उपवर्ग में doPost या doGet भीतर HttpServletRequest से पैरामीटर नहीं सकते हैं?

जो कुछ भी आप लेते हैं (getParemeter के माध्यम से) doPost के अंदर एक पोस्ट है और DoGet के अंदर कुछ भी एक GET है।

+0

मैं यूआरएल में पारित पैरामीटर को अनदेखा करने की कोशिश कर रहा हूं। उनको GetParameter द्वारा शामिल किया गया है इससे कोई फर्क नहीं पड़ता कि कौन सी HTTP विधि का उपयोग किया जाता है। – dankuck

+1

पोस्ट अनुरोधों में जीईटी और पोस्ट पैरामीटर दोनों हो सकते हैं। अगर केवल पैरामीटर प्राप्त (कहते हैं कि "उपनाम") मौजूद हो, तो अगर आप request.getParameter ("उपनाम") doPost अंदर करते हैं, आप "उपनाम" मिलेगा पैरामीटर प्राप्त है, जो आपके स्पष्टीकरण से अशक्त होना चाहिए। – Jamol

1

मुझे यकीन नहीं है कि यह काम करेगा, लेकिन आप request.getReader() का उपयोग कर पोस्ट बॉडी की कच्ची सामग्री निकालने का प्रयास कर सकते हैं। कंटेनर आपके एप्लिकेशन पर नियंत्रण सौंपने से पहले उस डेटा को हटा सकता है, और यहां तक ​​कि अगर ऐसा नहीं होता है, तो आपको पैरामीटर स्ट्रिंग को डीकोड करना होगा।

+0

अजीब पर्याप्त, मैं और अधिक दो अलग आम प्रारूप (और अन्य के किसी भी संख्या) पर राउंड के बारे में विचारों से ऊपर पोस्ट डेटा है क्योंकि सुझाव दिया उपयोग करने के लिए इच्छुक हूँ। – dankuck

2

मुझे लगता है कि आप HttpServletRequest इंटरफ़ेस से getMethod() के साथ कुछ कर सकते हैं।

Java doc 1.6

यह भी 1.4 और 1.5 में उपलब्ध है।

+0

यह आपको पैरामीटर के स्रोत के बारे में कुछ भी नहीं बताएगा। यह आपको बस बताएगा कि अनुरोध में कौन सी HTTP विधि का उपयोग किया गया था। – Yinzara

0

सवाल this related post में जवाब था:

Normaly आप प्राप्त कर सकते हैं और एक सर्वलेट में पोस्ट मापदंडों उसी तरह:

request.getParameter("cmd"); 

लेकिन सिर्फ अगर पोस्ट डेटा कुंजी और मान के रूप में एन्कोड किया गया है सामग्री प्रकार के जोड़े: "अनुप्रयोग/x-www फार्म-urlencoded" जब आप एक मानक एचटीएमएल फार्म का उपयोग की तरह।

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