জাভা সার্লেলে পোষ্ট অনুরোধ থেকে অনুরোধ পেইলড প্রাপ্তি


113

আমার একটি জাভাস্ক্রিপ্ট লাইব্রেরি আছে যা আমার জাভা সার্লেলে একটি পোষ্ট অনুরোধ পাঠাচ্ছে, তবে doPostপদ্ধতিতে, আমি অনুরোধ পেলোডের সামগ্রীগুলি পেয়েছি বলে মনে হয় না। ক্রোম বিকাশকারী সরঞ্জামগুলিতে, সমস্ত বিষয়বস্তু শিরোনাম ট্যাবে অনুরোধ পেইলোড বিভাগে রয়েছে এবং লিখিত সামগ্রীটি রয়েছে এবং আমি জানি যে ড.পোস্ট পদ্ধতি দ্বারা পোষ্টটি প্রাপ্ত হচ্ছে, তবে এটি খালি উঠে আসে।

জন্য HttpServletRequest বস্তু, কি ভাবে আমি অনুরোধ পে লোড ডাটা পেতে পারেন?

করছেন request.getParameter()বা request.getAttributes() উভয়ই কোনও ডেটা ছাড়াই শেষ করবেন


আপনাকে কোন পরামিতিটি নির্দিষ্ট করতে হবে উদাহরণস্বরূপ আপনার শরীরে কীওয়ার্ড থাকলে স্ট্রিং কীওয়ার্ড = অনুরোধ getgetParameter ("কীওয়ার্ড");
JustMe

জাভাস্ক্রিপ্ট কোডটি অনুরোধটি প্রেরণ করা আকর্ষণীয় হবে। এটি স্পষ্টতই ভুল উপায়ে অনুরোধের পরামিতিগুলি রচনা করছে।
বালুস সি

@ রাজ্জ্ব হ্যাঁ আমি জানি, আমি কেবল নির্দিষ্ট করেছিলাম যে আমি কোন পদ্ধতিগুলির চেষ্টা করছি। বালুসসি আমি বিভাজনযুক্ত ফাইল আপলোডগুলি পরিচালনা করতে পুনরায় শুরুযোগ্য লাইব্রেরিটি ব্যবহার করছি
ফ্যাসিহ আওয়ান

4
যদি আমি ভুল করছি না তবে এটি গুরুত্বপূর্ণ যে আপনি ইনপুট স্ট্রিমটি পড়ার আগে অনুরোধ.গেটপ্যারামিটার () ব্যবহার করবেন না অন্যথায় কোনও ডেটা পাওয়া যাবে না (ইতিমধ্যে পঠিত)।
জয়চ

উত্তর:


110

সহজ উত্তর:
অনুরোধের মুখ্য অংশটি পড়তে getReader () ব্যবহার করুন

আরও তথ্য:
দেহে ডেটা পড়ার জন্য দুটি পদ্ধতি রয়েছে:

  1. getReader()একটি বাফার্ডারীডার প্রদান করে যা আপনাকে অনুরোধের মূল অংশটি পড়তে দেয়।

  2. getInputStream()আপনার যদি বাইনারি ডেটা পড়তে হয় তবে একটি সার্লেটইনপুট স্ট্রিম প্রদান করে।

দস্তাবেজগুলি থেকে দ্রষ্টব্য: "[উভয় পদ্ধতিই] শরীর পড়তে বলা যেতে পারে, উভয়ই নয়" "


4
কোনও সমস্যা নেই, এটি কিছুটা লুকিয়ে আছে
ডেভিডফ্রান্সিস

25
আপনি যদি কেবলমাত্র একটি ফিল্টারটিতে এটি ব্যবহার করেন এবং তারপর আবিষ্কার করেন যে অন্য কোনও কিছুই শরীর আবার পড়তে পারে না এই পোস্টটি কার্যকর হতে পারে! natch3z.blogspot.co.uk/2009/01/read-request-body-in-filter.html
জনিআআআআআ

এটি একটি সত্যই খারাপ উত্তর।
SgtPooki

1
@ এসজিটিপুকি নির্দ্বিধায় এই মন্তব্য করার জন্য কিছু যুক্তি যুক্ত করতে পারেন, আমার ভাল স্যার!
ডেভিডফ্রান্সিস

@ ডেভিডফ্রান্সিস আমি এখানে আপনাকে ব্যক্তিগতভাবে বিচার করার চেষ্টা করছি না, তবে: আপনি কোনও প্রসঙ্গ সরবরাহ করেন নি .. নথিভুক্তির কোনও লিঙ্ক নেই, উদাহরণ নেই। আমার মন্তব্যে আপনার উত্তরটির উত্তরটির চেয়ে বেশি পরিশ্রম প্রয়োজন বলে মনে হচ্ছে।
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বলে মনে করেছি : পাঠক ইতিমধ্যে উন্মুক্ত হওয়ার ফলে যখন আমি getReader () বলেছিলাম।
বেনিয়ামিন স্ল্যাববার্ট

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);

এটি আকর্ষণীয়, তবে স্ট্রিং কনটেনটেশনের ক্ষেত্রে এটি বেশ অদক্ষ মনে হচ্ছে! কোনভাবেই এই উন্নতি করা যায়?
ডেভিডফ্রান্সিস

11
স্ট্রিং বডি = অনুরোধ.জেটআরেডার ()। লাইন ()। সংগ্রহ (সংগ্রাহক। জয়নিং ()); কাজ করতে পারে। সংগ্রাহক.জয়িং হুডের নিচে দৃশ্যমানভাবে স্ট্রিংবিল্ডার ব্যবহার করে।
অলিভার কোহল

3
আমি মনে করি এটির অনুরোধ করা উচিত।বিটআরডার ()। লাইনগুলি () সংগ্রহ করুন (যোগ দিন ("\ n")) নতুন লাইনের সংরক্ষণের জন্য।
মাইকেল বেকলিং

জাভা 8-তে, সমান্তরালভাবে প্রক্রিয়াজাত করা হবে তাই অনুক্রমিক পদ্ধতি যুক্ত করা দরকার অন্যথায় এটি ডেটাগুলির ভুল অংশটি মার্জ করবে - স্ট্রিং বডি = রিকোয়েস্ট.সেটরেডার () লাইন ()। সিক্যুয়াল () সংযোজক, প্রকৃত) -> সংগ্রহকারী + প্রকৃত)
যতীন বোদরিয়া

2
আপনি প্রতিস্থাপন করতে পারেন (accumulator, actual) -> accumulator + actualসঙ্গে String::concat
shmosel


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);

এখানেই শেষ. সুন্দর, সহজ এবং পরিষ্কার। অ্যাপ্লিকেশন / জসন এ কনটেন্ট-টাইপ শিরোনাম সেট করতে ভুলবেন না।


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 ()

পোষ্ট এবং জিইটি - পরামিতি পাওয়ার জন্য।

পদ্ধতিটি a 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()হবে এবং ম্যানুয়ালি পার্স করতে হবে।
twonkeys
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.