我知道过去有一种方法可以通过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请求并将响应主体作为字符串而不是流来获取?
答案 0 :(得分:239)
以下是我工作项目的两个例子。
HttpResponse response = httpClient.execute(new HttpGet(URL));
HttpEntity entity = response.getEntity();
String responseString = EntityUtils.toString(entity, "UTF-8");
System.out.println(responseString);
HttpResponse response = httpClient.execute(new HttpGet(URL));
String responseString = new BasicResponseHandler().handleResponse(response);
System.out.println(responseString);
答案 1 :(得分:89)
我能想到的每个库都会返回一个流。您可以使用IOUtils.toString()
中的Apache Commons IO在一次方法调用中将InputStream
读入String
。 E.g:
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作为最佳猜测,而不是使用本地系统默认值。
答案 2 :(得分:46)
以下是我正在使用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将响应主体作为String抓取。非常简单。
答案 3 :(得分: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 response header。
此标头包含有关有效负载的信息,可能定义文本数据的编码。即使您假设text types,也可能需要检查内容本身以确定正确的字符编码。 E.g。有关如何为该特定格式执行此操作的详细信息,请参阅HTML 4 spec。
知道编码后,可以使用InputStreamReader对数据进行解码。
这个答案取决于服务器做正确的事情 - 如果你想处理响应头与文档不匹配的情况,或者文档声明与使用的编码不匹配,那就是另一个水壶鱼。
答案 4 :(得分:9)
下面是使用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);
答案 5 :(得分:8)
这个怎么样?
org.apache.commons.io.IOUtils.toString(new URL("http://www.someurl.com/"));
答案 6 :(得分:6)
McDowell的回答是正确的。但是,如果你在上面几篇文章中尝试其他建议。
HttpEntity responseEntity = httpResponse.getEntity();
if(responseEntity!=null) {
response = EntityUtils.toString(responseEntity);
S.O.P (response);
}
然后它将为您提供illegalStateException,声明内容已被使用。
答案 7 :(得分:2)
我们也可以使用以下代码来获取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);
}
}
答案 8 :(得分:0)
这是一种轻量级的方法:
objectB
当然String responseString = "";
for (int i = 0; i < response.getEntity().getContentLength(); i++) {
responseString +=
Character.toString((char)response.getEntity().getContent().read());
}
包含网站的回复,回复的类型为responseString
,由HttpResponse
答案 9 :(得分:0)
以下是代码段,该段显示了将响应正文作为String处理的更好方法,无论它是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;
}
}
答案 10 :(得分:0)
您可以使用发送Http请求并处理响应的3-d参与者库。其中一种著名的产品是Apache commons HTTPClient:HttpClient javadoc,HttpClient Maven artifact。到目前为止,鲜为人知但更简单的HTTPClient(由我编写的开源MgntUtils库的一部分):MgntUtils HttpClient javadoc,MgntUtils maven artifact,MgntUtils Github。使用这些库中的任何一个,您都可以独立于Spring发送REST请求并接收响应,作为业务逻辑的一部分
答案 11 :(得分:0)
如果您正在使用Jackson来反序列化响应正文,则一个非常简单的解决方案是使用request.getResponseBodyAsStream()
而不是 request.getResponseBodyAsString()
答案 12 :(得分: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();
答案 13 :(得分:0)
使用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();