আমি কীভাবে জাভাতে স্ট্রিং হিসাবে একটি HTTP প্রতিক্রিয়া বডি পেতে পারি?


155

আমি জানি যে এখানে এখানে দলিল হিসাবে অ্যাপাচি কমন্স দিয়ে পাওয়ার একটি উপায় ছিল: http://hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpMethod.html এবং এখানে একটি উদাহরণ:

http://www.kodejava.org/examples/416.html

তবে আমি বিশ্বাস করি এটি অবহেলিত। জাভাতে কোনও এইচটিসিপি রিকোয়েস্ট পাওয়ার এবং স্ট্রিম হিসাবে প্রতিক্রিয়া বডিটি পাওয়ার জন্য অন্য কোনও উপায় আছে কি না?


1
যেহেতু প্রশ্ন এবং সমস্ত উত্তরগুলি অ্যাপাচি লাইব্রেরিগুলি সম্পর্কে বলে মনে হচ্ছে, তাই এটি ট্যাগ করা উচিত। আমি তৃতীয় পক্ষের libs ব্যবহার না করে কিছু দেখতে পাচ্ছি না।
eis

সম্পর্কিত: stackoverflow.com/questions/21574478
tkruse

উত্তর:


104

আমি ভাবতে পারি প্রতিটি লাইব্রেরি একটি প্রবাহ ফেরত দেয়। আপনি ব্যবহার করতে পারে IOUtils.toString()থেকে অ্যাপাচি কমন্স আই একটি পড়তে InputStreamএকটি মধ্যে Stringএক পদ্ধতি কলে। উদাহরণ:

URL url = new URL("http://www.example.com/");
URLConnection con = url.openConnection();
InputStream in = con.getInputStream();
String encoding = con.getContentEncoding();
encoding = encoding == null ? "UTF-8" : encoding;
String body = IOUtils.toString(in, encoding);
System.out.println(body);

আপডেট: আমি উপলব্ধ থাকলে প্রতিক্রিয়া থেকে সামগ্রী এনকোডিং ব্যবহার করতে উপরের উদাহরণটি পরিবর্তন করেছি। অন্যথায় এটি স্থানীয় সিস্টেম ডিফল্ট ব্যবহার না করে সেরা অনুমান হিসাবে ইউটিএফ -8 এ ডিফল্ট হবে।


4
এটি অনেক ক্ষেত্রে পাঠ্যকে দূষিত করবে কারণ পদ্ধতিটি সিস্টেম ডিফল্ট পাঠ্য এনকোডিং ব্যবহার করে যা ওএস এবং ব্যবহারকারীর সেটিংসের ভিত্তিতে পরিবর্তিত হয়।
ম্যাকডোভেল

1
@ এমসিডোয়েল: ওফ ধন্যবাদ, আমি পদ্ধতিটির জন্য জাভাদোকটিকে এনকোডিংয়ের সাথে সংযুক্ত করেছি তবে উদাহরণ হিসাবে আমি এটি ব্যবহার করতে ভুলে গেছি। আমি আপাতত উদাহরণটিতে ইউটিএফ -8 যুক্ত করেছি, যদিও প্রযুক্তিগতভাবে Content-Encodingউপলব্ধ থাকলে প্রতিক্রিয়া থেকে শিরোনামটি ব্যবহার করা উচিত ।
হোয়াইটফ্যাং 34

আইওউটিলসের দুর্দান্ত ব্যবহার। চমৎকার অভ্যাসগত পদ্ধতির।
স্পাইডি

8
আসলে চরসেটটি "চারসেট = ..." এর মতো বিষয়বস্তুতে নির্দিষ্ট করা হয়েছে, তবে বিষয়বস্তু এনকোডিংয়ে নয়, এতে 'জিজিপ'-এর মতো কিছু রয়েছে
তৈমুর ইউসুপভ

1
এই ফাংশনটির ফলে ইনপুট স্ট্রিম বন্ধ হয়ে যায়, @ হোয়াইটফ্যাং 34 এর এমন কোনও উপায় আছে যা আমি আমার প্রতিক্রিয়া মুদ্রণ করতে এবং এইচটিপি সত্তা ব্যবহার চালিয়ে যেতে পারি
amIT

274

আমার কার্যনির্বাহী প্রকল্পের দুটি উদাহরণ এখানে।

  1. ব্যবহার EntityUtilsএবংHttpEntity

    HttpResponse response = httpClient.execute(new HttpGet(URL));
    HttpEntity entity = response.getEntity();
    String responseString = EntityUtils.toString(entity, "UTF-8");
    System.out.println(responseString);
  2. ব্যবহার BasicResponseHandler

    HttpResponse response = httpClient.execute(new HttpGet(URL));
    String responseString = new BasicResponseHandler().handleResponse(response);
    System.out.println(responseString);

10
পদ্ধতি 1 টির সাথে আমি একমাত্র সমস্যার মুখোমুখি হ'ল, যখন আপনি করবেন তখন সত্তা অবজেক্টটি গ্রাস হয়ে যায় response.getEntity()এবং এটি এখন হিসাবে উপলব্ধ responseString। যদি আপনি আবার একটি রেসপন্স.গেট এন্টিটি () করার চেষ্টা করেন তবে তা ফিরে আসবে IllegalStateException
তীর্থ

আমার ক্ষেত্রে কাজ করেছে - ক্লোজযোগ্যএইচটিপিপ্লায়েন্টের প্রতিক্রিয়া থেকে দেহ পাওয়া।
জারোস্লাভ reত্রেইট


1
@AndreasL। এইচটিসিপিএলেন্ট হ'ল এইচটিপিপ্লিনেন্ট (org.apache.commons.httpclient প্যাকেজ) টাইপ
স্পাইডারিংয়েব

স্ট্রিং বা বাইট অ্যারে বা কিছু হিসাবে প্রতিক্রিয়া সামগ্রী পেতে এটি এত সাধারণ। আপনাকে এটি দেওয়ার জন্য সরাসরি সত্তায় কোনও এপিআই দিয়ে ভাল লাগবে। এই ব্যবহার শ্রেণীর জন্য এটি সন্ধান করতে হবে।
ক্লজ ইবসেন

52

এখানে অন্য একটি সহজ প্রকল্পের একটি উদাহরণ যা আমি অ্যাপাচি থেকে httpclient গ্রন্থাগারটি ব্যবহার করে কাজ করছি:

String response = new String();
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("j", request));
HttpEntity requestEntity = new UrlEncodedFormEntity(nameValuePairs);

HttpPost httpPost = new HttpPost(mURI);
httpPost.setEntity(requestEntity);
HttpResponse httpResponse = mHttpClient.execute(httpPost);
HttpEntity responseEntity = httpResponse.getEntity();
if(responseEntity!=null) {
    response = EntityUtils.toString(responseEntity);
}

একটি স্ট্রিং হিসাবে প্রতিক্রিয়া বডি দখল করতে কেবল সত্ত্বা ইউটিগুলি ব্যবহার করুন। খুব সহজ.


28

এটি নির্দিষ্ট ক্ষেত্রে তুলনামূলকভাবে সহজ তবে সাধারণ ক্ষেত্রে এটি বেশ জটিল।

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://stackoverflow.com/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.getContentMimeType(entity));
System.out.println(EntityUtils.getContentCharSet(entity));

উত্তরটি Content-Type HTTP প্রতিক্রিয়া শিরোনামের উপর নির্ভর করে ।

এই শিরোনামে পে-লোড সম্পর্কে তথ্য রয়েছে এবং পাঠ্য ডেটার এনকোডিং সংজ্ঞায়িত হতে পারে। এমনকি যদি আপনি অনুমান টেক্সট ধরনের , আপনি সঠিক অক্ষর এনকোডিং নির্ধারণ করা বিষয়বস্তু নিজেই পরিদর্শন করতে হতে পারে। যেমন particular নির্দিষ্ট ফর্ম্যাটের জন্য এটি কীভাবে করা যায় তার বিশদ জানতে এইচটিএমএল 4 টি দেখুন see

এনকোডিংটি জানা হয়ে গেলে, ইনপুট স্ট্রিমরিডার ডেটা ডিকোড করতে ব্যবহার করা যেতে পারে।

এই উত্তরটি সার্ভারের উপর নির্ভর করে সঠিক কাজ করছে - যদি আপনি এমন মামলাগুলি পরিচালনা করতে চান যেখানে প্রতিক্রিয়া শিরোনাম নথির সাথে মেলে না বা নথির ঘোষণাগুলি ব্যবহৃত এনকোডিংয়ের সাথে মেলে না, এটি মাছের আর একটি কেটলি।


কিভাবে এটি হাশম্যাপ হিসাবে পাবেন? আমি জসন হিসাবে প্রতিক্রিয়া পাই, কিভাবে এটি পড়া?
ব্যবহারকারী 1735921

10

নীচে অ্যাপাচি এইচটিটিপি ক্লায়েন্ট লাইব্রেরি ব্যবহার করে স্ট্রিং হিসাবে প্রতিক্রিয়াটি অ্যাক্সেস করার একটি সহজ উপায়।

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;

//... 

HttpGet get;
HttpClient httpClient;

// initialize variables above

ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpClient.execute(get, responseHandler);


9

ম্যাকডোভেলের উত্তর সঠিক। তবে আপনি যদি উপরের কয়েকটি পোস্টে অন্য পরামর্শ চেষ্টা করেন।

HttpEntity responseEntity = httpResponse.getEntity();
if(responseEntity!=null) {
   response = EntityUtils.toString(responseEntity);
   S.O.P (response);
}

তারপরে এটি আপনাকে অবৈধভাবে স্টেট এক্সেপশন দেবে যা উল্লেখ করে যে সামগ্রীটি ইতিমধ্যে গ্রাস হয়ে গেছে।


3

জাভাতে এইচটিএমএল রেসপন্স পেতে আমরা নীচের কোডটিও ব্যবহার করতে পারি

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.HttpResponse;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.log4j.Logger;

public static void main(String[] args) throws Exception {
    HttpClient client = new DefaultHttpClient();
    //  args[0] :-  http://hostname:8080/abc/xyz/CheckResponse
    HttpGet request1 = new HttpGet(args[0]);
    HttpResponse response1 = client.execute(request1);
    int code = response1.getStatusLine().getStatusCode();

    try (BufferedReader br = new BufferedReader(new InputStreamReader((response1.getEntity().getContent())));) {
        // Read in all of the post results into a String.
        String output = "";
        Boolean keepGoing = true;
        while (keepGoing) {
            String currentLine = br.readLine();

            if (currentLine == null) {
                keepGoing = false;
            } else {
                output += currentLine;
            }
        }

        System.out.println("Response-->" + output);
    } catch (Exception e) {
        System.out.println("Exception" + e);

    }
}

এটি খুব ভাল প্রতিক্রিয়া, এটিই আমার প্রদর্শন করা দরকার, সার্ভারে ডেটা পোস্ট করার পরে প্রতিক্রিয়া। সাবাশ.
স্লিমেন্টটিএন

0

এটি করার একটি হালকা উপায় এখানে:

String responseString = "";
for (int i = 0; i < response.getEntity().getContentLength(); i++) { 
    responseString +=
    Character.toString((char)response.getEntity().getContent().read()); 
}

অবশ্যই responseStringওয়েবসাইটের প্রতিক্রিয়া এবং প্রতিক্রিয়া সহ ধরণের HttpResponse, ফিরে এসেছেHttpClient.execute(request)


0

নিম্নলিখিত কোড স্নিপেট যা প্রতিক্রিয়া বডিটিকে স্ট্রিং হিসাবে পরিচালনা করার আরও ভাল উপায় দেখায় এটি HTTP পোষ্ট অনুরোধের জন্য কোনও বৈধ প্রতিক্রিয়া বা ত্রুটি প্রতিক্রিয়া কিনা:

BufferedReader reader = null;
OutputStream os = null;
String payload = "";
try {
    URL url1 = new URL("YOUR_URL");
    HttpURLConnection postConnection = (HttpURLConnection) url1.openConnection();
    postConnection.setRequestMethod("POST");
    postConnection.setRequestProperty("Content-Type", "application/json");
    postConnection.setDoOutput(true);
    os = postConnection.getOutputStream();
    os.write(eventContext.getMessage().getPayloadAsString().getBytes());
    os.flush();

    String line;
    try{
        reader = new BufferedReader(new InputStreamReader(postConnection.getInputStream()));
    }
    catch(IOException e){
        if(reader == null)
            reader = new BufferedReader(new InputStreamReader(postConnection.getErrorStream()));
    }
    while ((line = reader.readLine()) != null)
        payload += line.toString();
}       
catch (Exception ex) {
            log.error("Post request Failed with message: " + ex.getMessage(), ex);
} finally {
    try {
        reader.close();
        os.close();
    } catch (IOException e) {
        log.error(e.getMessage(), e);
        return null;
    }
}

0

আপনি একটি 3-ডি পার্টি লাইব্রেরি ব্যবহার করতে পারেন যা এইচটিটিপি অনুরোধ প্রেরণ করে এবং প্রতিক্রিয়াটি পরিচালনা করে। সুপরিচিত পণ্যগুলির মধ্যে একটি হ'ল অ্যাপাচি কমন্স এইচটিটিপি ক্লিনেন্ট: এইচটিপিপি্লিয়েন্ট জাভাদোক , এইচটিপিপি্লিয়েন্ট মাভেন আর্টিক্ট । এখানে অনেক কম পরিচিত তবে খুব সহজ এইচটিটিপিসিলেট (আমার লেখা লিখিত একটি ওপেন সোর্স MgntUtils গ্রন্থাগারের অংশ): MgntUtils HttpClient javadoc , MgntUtils maven আর্টিক্ট , MgntUtils Github । এই লাইব্রেরিগুলির মধ্যে যে কোনও একটি ব্যবহার করে আপনি আপনার REST অনুরোধটি প্রেরণ করতে এবং আপনার ব্যবসার যুক্তির অংশ হিসাবে স্প্রিং থেকে স্বাধীনভাবে প্রতিক্রিয়া পেতে পারেন


0

আপনি যদি জ্যাকসনকে প্রতিক্রিয়া বডিটি ডিজিয়ালাইজ করতে ব্যবহার করেন তবে এর একটি খুব সহজ সমাধানটি এর request.getResponseBodyAsStream()পরিবর্তে ব্যবহার করাrequest.getResponseBodyAsString()

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.