Bagaimana saya bisa mendapatkan badan tanggapan http sebagai string di Jawa?

155

Saya tahu dulu ada cara untuk mendapatkannya dengan apache commons seperti yang didokumentasikan di sini: http://hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpMethod.html dan sebuah contoh di sini:

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

tapi saya percaya ini sudah usang. Apakah ada cara lain untuk membuat permintaan http mendapatkan di java dan mendapatkan tubuh respon sebagai string dan bukan stream?

Danish94
sumber
1
Karena pertanyaan dan semua jawaban tampaknya tentang pustaka apache, ini harus ditandai seperti itu. Saya tidak melihat apa-apa tanpa menggunakan lib pihak ke-3.
eis

Jawaban:

104

Setiap perpustakaan yang saya pikirkan mengembalikan aliran. Anda dapat menggunakan IOUtils.toString()dari Apache Commons IO untuk membacakan InputStreamke Stringdalam metode panggilan satu. Misalnya:

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

Pembaruan: Saya mengubah contoh di atas untuk menggunakan pengkodean konten dari respons jika tersedia. Kalau tidak, itu akan default ke UTF-8 sebagai tebakan terbaik, alih-alih menggunakan standar sistem lokal.

WhiteFang34
sumber
4
ini akan merusak teks dalam banyak kasus karena metode ini menggunakan pengkodean teks standar sistem yang bervariasi berdasarkan OS dan pengaturan pengguna.
McDowell
1
@ McDowell: oops terima kasih, saya menautkan javadoc untuk metode pengkodean tapi saya lupa menggunakannya dalam contoh. Saya menambahkan UTF-8 ke contoh untuk saat ini, walaupun secara teknis harus menggunakan Content-Encodingheader dari respons jika tersedia.
WhiteFang34
Penggunaan IOUtils yang luar biasa. Pendekatan pratik yang bagus.
Spidey
8
Sebenarnya charset ditentukan dalam contentType seperti "charset = ...", tetapi tidak dalam contentEncoding, yang berisi sesuatu seperti 'gzip'
Timur Yusupov
1
fungsi ini menyebabkan aliran input ditutup, apakah ada cara @ WhiteFang34 saya dapat mencetak respons saya dan terus menggunakan entitas http
amIT
274

Berikut adalah dua contoh dari proyek kerja saya.

  1. Menggunakan EntityUtilsdanHttpEntity

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

    HttpResponse response = httpClient.execute(new HttpGet(URL));
    String responseString = new BasicResponseHandler().handleResponse(response);
    System.out.println(responseString);
spideringweb
sumber
10
Satu-satunya masalah yang saya hadapi dengan metode 1 adalah, objek entitas dikonsumsi ketika Anda melakukannya response.getEntity()dan sekarang tersedia sebagai responseString. jika Anda mencoba melakukan response.getEntity () lagi, itu akan kembali IllegalStateException.
Tirtha
Bekerja dalam kasus saya - mendapatkan tubuh dari respons CloseableHttpClient.
Jaroslav Štreit
1
Apa itu httpClient ?!
Andreas L.
1
@AndreasL. httpClient adalah tipe HttpClient (paket org.apache.commons.httpclient)
spideringweb
Sangat umum untuk mendapatkan konten respons sebagai string atau byte array atau sesuatu. Akan menyenangkan dengan API langsung pada Entity untuk memberi Anda itu. Harus mencari ini untuk menemukan kelas util ini.
Claus Ibsen
52

Berikut ini contoh dari proyek sederhana lain yang sedang saya kerjakan menggunakan pustaka httpclient dari Apache:

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

cukup gunakan EntityUtils untuk mengambil tubuh respons sebagai sebuah String. sangat sederhana.

moonlightcheese
sumber
28

Ini relatif sederhana dalam kasus tertentu, tetapi cukup rumit dalam kasus umum.

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

Jawabannya tergantung pada Content-Type tajuk respons HTTP .

Header ini berisi informasi tentang payload dan mungkin menentukan pengkodean data tekstual. Bahkan jika Anda menganggap jenis teks , Anda mungkin perlu memeriksa konten itu sendiri untuk menentukan pengkodean karakter yang benar. Misalnya, lihat spesifikasi HTML 4 untuk detail tentang cara melakukan itu untuk format tertentu.

Setelah pengkodean diketahui, InputStreamReader dapat digunakan untuk mendekode data.

Jawaban ini tergantung pada server yang melakukan hal yang benar - jika Anda ingin menangani kasus di mana header respons tidak cocok dengan dokumen, atau deklarasi dokumen tidak cocok dengan pengkodean yang digunakan, itu adalah ketel ikan.

McDowell
sumber
bagaimana cara mendapatkannya sebagai HashMap? Saya mendapat respons sebagai Json, bagaimana cara membacanya?
user1735921
10

Di bawah ini adalah cara sederhana untuk mengakses respons sebagai String menggunakan pustaka Apache HTTP Client.

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);
lkamal
sumber
9

Bagaimana dengan ini saja?

org.apache.commons.io.IOUtils.toString(new URL("http://www.someurl.com/"));
Eric Schlenz
sumber
9

Jawaban oleh McDowell benar. Namun jika Anda mencoba saran lain di beberapa posting di atas.

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

Maka itu akan memberi Anda ilegalStateException yang menyatakan bahwa konten sudah dikonsumsi.

Akshay
sumber
3

Kita dapat menggunakan kode di bawah ini juga untuk mendapatkan Respons HTML di java

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

    }
}
Subhasish Sahu
sumber
Ini adalah respons yang sangat baik, inilah yang perlu saya tampilkan, respons setelah mengirim data ke server. Sudah selesai dilakukan dengan baik.
SlimenTN
0

Inilah cara ringan untuk melakukannya:

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

Dengan tentu saja responseStringberisi tanggapan dan tanggapan situs web sebagai tipe HttpResponse, dikembalikan olehHttpClient.execute(request)

Marko Zajc
sumber
0

Berikut ini adalah cuplikan kode yang menunjukkan cara yang lebih baik untuk menangani badan respons sebagai sebuah String apakah itu respons yang sah atau respons kesalahan untuk permintaan HTTP POST:

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;
    }
}
Krutik
sumber
0

Anda dapat menggunakan pustaka pihak 3-d yang mengirimkan permintaan Http dan menangani respons. Salah satu produk yang terkenal adalah Apache commons HTTPClient: HttpClient javadoc , artefak HttpClient Maven . Ada HTTPClient jauh lebih dikenal tetapi jauh lebih sederhana (bagian dari perpustakaan open source MgntUtils yang ditulis oleh saya): MgntUtils HttpClient javadoc , MgntUtils maven artefak , MgntUtils Github . Dengan menggunakan salah satu pustaka tersebut, Anda dapat mengirim permintaan REST dan menerima respons secara mandiri dari Spring sebagai bagian dari logika bisnis Anda

Michael Gantman
sumber
0

Jika Anda menggunakan Jackson deserialize respon tubuh, salah satu solusi yang sangat sederhana adalah dengan menggunakan request.getResponseBodyAsStream()bukannyarequest.getResponseBodyAsString()

Vic Seedoubleyew
sumber