178

我知道曾经有一种方法可以使用 Apache Commons 获取它,如此处所述:

http://hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpMethod.html

......这里有一个例子:

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

...但我相信这已被弃用。

有没有其他方法可以在 Java 中发出 http get 请求并将响应主体作为字符串而不是流获取?

4

14 回答 14

307

这是我的工作项目中的两个示例。

  1. 使用EntityUtilsHttpEntity

    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);
    
于 2012-12-06T11:08:22.457 回答
113

我能想到的每个库都会返回一个流。您可以使用IOUtils.toString()Apache Commons IO来读取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);

更新:我将上面的示例更改为使用响应中的内容编码(如果可用)。否则它将默认使用 UTF-8 作为最佳猜测,而不是使用本地系统默认值。

于 2011-04-24T09:33:49.397 回答
52

这是我正在使用 Apache 的 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);
}

只需使用 EntityUtils 将响应正文作为字符串获取。很简单。

于 2012-03-06T21:37:27.390 回答
30

这在特定情况下相对简单,但在一般情况下相当棘手。

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 响应标头

此标头包含有关有效负载的信息,并且可能定义文本数据的编码。即使您假设text types,您也可能需要检查内容本身以确定正确的字符编码。例如,请参阅HTML 4 规范以了解有关如何针对该特定格式执行此操作的详细信息。

一旦知道编码,就可以使用InputStreamReader来解码数据。

这个答案取决于服务器做正确的事情——如果你想处理响应头与文档不匹配的情况,或者文档声明与使用的编码不匹配,那又是一锅鱼。

于 2011-04-24T10:18:07.443 回答
11

下面是使用 Apache HTTP 客户端库以字符串形式访问响应的简单方法。

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);
于 2016-01-12T10:06:05.227 回答
10

麦克道威尔的答案是正确的。但是,如果您在上面的几篇文章中尝试其他建议。

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

然后它会给你非法状态异常,说明内容已经被消费了。

于 2014-03-28T04:32:24.383 回答
9

就这个怎么样?

org.apache.commons.io.IOUtils.toString(new URL("http://www.someurl.com/"));
于 2012-03-22T14:58:13.177 回答
3

我们也可以使用下面的代码在 java 中获取 HTML 响应

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

    }
}
于 2016-12-26T07:05:15.073 回答
1

以下代码片段显示了将响应主体作为字符串处理的更好方法,无论它是 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;
    }
}
于 2018-12-12T08:29:03.960 回答
1

这是一种轻量级的方法:

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

当然responseString包含网站的响应和响应类型为HttpResponse, 返回HttpClient.execute(request)

于 2017-09-18T14:29:16.850 回答
0

这是一个普通的 Java 答案:

import java.net.http.HttpClient;
import java.net.http.HttpResponse;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;

...
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
  .uri(targetUrl)
  .header("Content-Type", "application/json")
  .POST(BodyPublishers.ofString(requestBody))
  .build();
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
String responseString = (String) response.body();
于 2021-02-24T05:55:24.530 回答
0

如果您使用 Jackson 来反序列化响应正文,一个非常简单的解决方案是使用request.getResponseBodyAsStream()而不是request.getResponseBodyAsString()

于 2019-07-05T15:31:45.907 回答
0

您可以使用发送 Http 请求并处理响应的 3-d 方库。众所周知的产品之一是 Apache commons HTTPClient: HttpClient javadoc , HttpClient Maven artifact。迄今为止鲜为人知但更简单的 HTTPClient(我编写的开源 MgntUtils 库的一部分):MgntUtils HttpClient javadocMgntUtils maven artifactMgntUtils Github。使用这些库中的任何一个,您都可以发送 REST 请求并独立于 Spring 作为业务逻辑的一部分接收响应

于 2019-05-21T19:02:40.510 回答
-1

使用 Apache commons Fluent API,可以如下所述完成,

String response = Request.Post("http://www.example.com/")
                .body(new StringEntity(strbody))
                .addHeader("Accept","application/json")
                .addHeader("Content-Type","application/json")
                .execute().returnContent().asString();
于 2021-05-05T08:36:47.667 回答