जावा सर्वलेट में POST अनुरोध से पेलोड का अनुरोध प्राप्त करना


113

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

के लिए HttpServletRequest वस्तु, किस तरह से मैं अनुरोध पेलोड में डेटा प्राप्त कर सकते हैं?

ऐसा करना request.getParameter()या request.getAttributes() दोनों का बिना किसी डेटा के समाप्त होना


आपको यह निर्दिष्ट करने की आवश्यकता है कि यदि आपके पास शरीर में कीवर्ड है, तो स्ट्रिंग कीवर्ड = request.getParameter ("कीवर्ड") का उपयोग करें;
justMe

जावास्क्रिप्ट कोड को अनुरोध भेजते हुए देखना दिलचस्प होगा। यह जाहिरा तौर पर अनुरोध मापदंडों को गलत तरीके से रचना है।
बालुस

@ राज अच्छी तरह से मुझे पता है, मैं सिर्फ निर्दिष्ट कर रहा था कि मैं किन तरीकों की कोशिश कर रहा था। BalusC मैं स्प्लिट फ़ाइल अपलोड को संभालने के लिए resumable.js लाइब्रेरी का उपयोग कर रहा हूं
Fasih Awan

4
यदि मैं गलत नहीं हूँ, तो यह महत्वपूर्ण है कि आप इनपुट स्ट्रीम से पढ़ने से पहले request.getParameter () का उपयोग न करें अन्यथा कोई डेटा उपलब्ध नहीं होगा (पहले से पढ़ा हुआ)।
21

जवाबों:


110

सरल उत्तर:
अनुरोध के शरीर को पढ़ने के लिए getReader () का उपयोग करें

अधिक जानकारी:
शरीर में डेटा पढ़ने के लिए दो तरीके हैं:

  1. getReader()एक बफ़ररएडर लौटाता है जो आपको अनुरोध के निकाय को पढ़ने की अनुमति देगा।

  2. getInputStream()यदि आपको बाइनरी डेटा पढ़ने की आवश्यकता है, तो एक ServletInputStream लौटाता है ।

डॉक्स से ध्यान दें: "[या तो विधि] को शरीर को पढ़ने के लिए बुलाया जा सकता है, दोनों को नहीं।"


4
कोई समस्या नहीं, यह थोड़ा छिपा हुआ है कि एक
davidfrancis

25
यह पोस्ट उपयोगी हो सकती है यदि आपने इसे केवल एक फिल्टर में उपयोग किया है और फिर खोज की है कि शरीर को फिर से नहीं पढ़ा जा सकता है! natch3z.blogspot.co.uk/2009/01/read-request-body-in-filter.html
JonnyRaa

यह वास्तव में बुरा जवाब है।
SgtPooki

1
@SgtPooki उस टिप्पणी के लिए कुछ तर्क जोड़ने के लिए स्वतंत्र महसूस करता है, मेरे अच्छे साहब!
davidfrancis

@davidfrancis मैं आपको यहाँ व्यक्तिगत रूप से आंकने की कोशिश नहीं कर रहा हूँ, लेकिन: आपने कोई संदर्भ नहीं दिया है .. प्रलेखन का कोई लिंक नहीं, कोई उदाहरण नहीं। मेरी टिप्पणी के लिए आपके जवाब से लगता है कि उत्तर की तुलना में अधिक प्रयास की आवश्यकता है।
SgtPooki

68
String payloadRequest = getBody(request);

इस विधि का उपयोग करना

public static String getBody(HttpServletRequest request) throws IOException {

    String body = null;
    StringBuilder stringBuilder = new StringBuilder();
    BufferedReader bufferedReader = null;

    try {
        InputStream inputStream = request.getInputStream();
        if (inputStream != null) {
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            char[] charBuffer = new char[128];
            int bytesRead = -1;
            while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                stringBuilder.append(charBuffer, 0, bytesRead);
            }
        } else {
            stringBuilder.append("");
        }
    } catch (IOException ex) {
        throw ex;
    } finally {
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException ex) {
                throw ex;
            }
        }
    }

    body = stringBuilder.toString();
    return body;
}

6
खाते के request.getInputStream()चरित्र एन्कोडिंग के रूप में request.getReader()करता है कि सम्मान नहीं करता खाते में ले लो । तो यह उदाहरण डिफ़ॉल्ट सिस्टम चारसेट का उपयोग करता है।
वडज़िम

9
new BufferedReader(new InputStreamReader(request.getInputStream()))बस request.getReader()पहले से ही बफर है और यह भी अनुरोध एन्कोडिंग को बनाए रखता है सरलीकृत किया जा सकता है ।
वडज़िम

1
मुझे यह समाधान एक अपवाद के रूप में मददगार लगा, जो फेंका गया: javax.servlet.ServletException: java.lang.IllegalStateException: getInputStream() has already been called for this requestजब मैंने गेटरेडर () को कॉल किया तो पाठक पहले से ही खुले हुए थे।
बेंजामिन स्लैबर्ट रॉबर्ट

52

आप पढ़ने के अनुरोध से बफर रीडर का उपयोग कर सकते हैं

    // Read from request
    StringBuilder buffer = new StringBuilder();
    BufferedReader reader = request.getReader();
    String line;
    while ((line = reader.readLine()) != null) {
        buffer.append(line);
    }
    String data = buffer.toString()

40

जावा 8 स्ट्रीम

String body = request.getReader().lines()
    .reduce("", (accumulator, actual) -> accumulator + actual);

यह दिलचस्प है, लेकिन स्ट्रिंग संघनन के मामले में काफी अक्षम दिखता है! किसी भी तरह से इसमें सुधार किया जा सकता है?
davidfrancis

11
स्ट्रिंग बॉडी = request.getReader () लाइन्स ()। कलेक्ट (कलेक्टर। जॉइनिंग ()); काम भी कर सकते हैं। संग्राहक.जॉइनिंग हूड के तहत एक स्ट्रिंगबर्ल का उपयोग स्पष्ट रूप से करता है।
ओलिवर कोहल

3
मुझे लगता है कि यह अनुरोध करना चाहिए। मतगणना () लाइनों ()। इकट्ठा (शामिल होने ("\ n")) को नए सिरे से संरक्षित करने के लिए।
माइकल बॉक्लिंग

जावा 8 में, धारा को समान रूप से संसाधित किया जाएगा ताकि अनुक्रमिक विधि को जोड़ने की आवश्यकता हो अन्यथा यह डेटा के गलत हिस्से को मर्ज कर देगा - स्ट्रिंग बॉडी = request.getReader () लाइनें। (अनुक्रमिक) () कम करें (System.line.eparator) ()। संचायक, वास्तविक) -> संचायक + वास्तविक)
जतिन बोदारा

2
आप बदल सकते हैं (accumulator, actual) -> accumulator + actualके साथ String::concat
शमोसल


12

यदि शरीर की सामग्री जावा 8 में एक स्ट्रिंग है तो आप यह कर सकते हैं:

String body = request.getReader().lines().collect(Collectors.joining());


5

यदि आप JSON में पेलोड भेजने में सक्षम हैं, तो यह प्लेलोड पढ़ने का सबसे सुविधाजनक तरीका है:

उदाहरण डेटा वर्ग:

public class Person {
    String firstName;
    String lastName;
    // Getters and setters ...
}

उदाहरण पेलोड (अनुरोध निकाय):

{ "firstName" : "John", "lastName" : "Doe" }

सर्वलेट में पेलोड को पढ़ने के लिए कोड (com.google.gson। * की आवश्यकता है):

Person person = new Gson().fromJson(request.getReader(), Person.class);

बस इतना ही। अच्छा, आसान और साफ। एप्लिकेशन / json में सामग्री-प्रकार हेडर सेट करना न भूलें।


2

संसाधनों के साथ जावा 8 का उपयोग करने का प्रयास करें:

    StringBuilder stringBuilder = new StringBuilder();
    try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()))) {
        char[] charBuffer = new char[1024];
        int bytesRead;
        while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
            stringBuilder.append(charBuffer, 0, bytesRead);
        }
    }

1

आपको केवल जरूरत है

request.getParameterMap ()

POST और GET - पैरामीटर प्राप्त करने के लिए।

विधि एक लौटाता है Map<String,String[]>

आप मानचित्र में मापदंडों को पढ़ सकते हैं

Map<String, String[]> map = request.getParameterMap();
//Reading the Map
//Works for GET && POST Method
for(String paramName:map.keySet()) {
    String[] paramValues = map.get(paramName);

    //Get Values of Param Name
    for(String valueOfParam:paramValues) {
        //Output the Values
        System.out.println("Value of Param with Name "+paramName+": "+valueOfParam);
    }
}

2
खबरदार: यदि आप एन्कोडिंग का उपयोग करते हैं तो पैरामीटर केवल उपलब्ध हैं application/x-www-form-urlencoded; के लिए multipart/form-data, आपको जाहिरा तौर पर शरीर के हिस्से को इसके माध्यम से एक्सेस करना होगा request.getReader()और इसे मैन्युअल रूप से पार्स करना होगा।
टहनियाँ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.