我正在尝试编写一个简单的img
程序。
这是我第一次使用HttpClient
,我很困惑要包括哪些罐子。
当我创建HttpClient
对象时,我已将apache-httpcomponents-httpclient.jar
和org.apache.commons.httpclient.jar
包含在这些对象中我在客户端对象中看到了不同的方法
HttpClient
但是当我谷歌时,我会看到一个不同的例子,如下所示。两者有什么区别?为什么一个package com.comverse.rht;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.URI;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
public class HttpClientTest {
public static void main(String[] args) throws URIException {
URI url = new URI("http://www.google.com/search?q=httpClient");
HttpClient client = new HttpClient();
GetMethod get = new GetMethod();
PostMethod post = new PostMethod();
String responseString;
StringBuilder sb = new StringBuilder();
String line;
// add request header
get.setURI(url);
get.addRequestHeader("User-Agent", "shaiksha429");
try {
int respCode = client.executeMethod(get);
System.out.println("Response Code:" +respCode);
System.out.println(
"PCRF HTTP Status" + HttpStatus.getStatusText(respCode)
);
responseString = get.getResponseBodyAsString();
BufferedReader rd = null;
rd = new BufferedReader(
new InputStreamReader(get.getResponseBodyAsStream())
);
while ((line = rd.readLine()) != null) {
sb.append(line + '\n');
}
System.out.println(sb);
} catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
有"执行"另一个有" HttpClient
"。我需要使用哪一个?
executeMethod
答案 0 :(得分:7)
从HttpClient版本3到版本4有很多变化。第二个例子肯定来自HttpClient 4,所以第一个例子可能来自之前的版本。
以下是进行谷歌搜索的代码,并将结果读入字符串
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(60);
connectionManager.setDefaultMaxPerRoute(6);
try (CloseableHttpClient client = HttpClients.custom().setConnectionManager(connectionManager).build()) {
HttpGet request = new HttpGet("http://www.google.com/search?q=httpClient");
request.setHeader("User-Agent", "HttpClient");
try (CloseableHttpResponse response = client.execute(request)) {
MediaType mediaType = MediaType.parseMediaType(response.getFirstHeader("Content-Type").getValue());
Charset charSet = mediaType.getCharSet();
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
String body = CharStreams.toString(new InputStreamReader(is, charSet));
System.out.println("body = " + body);
EntityUtils.consume(entity);
}
}
首先,您可能想要创建连接池,因此如果向同一服务器发送多个请求,则可以重用连接。该池通常在应用程序初始化期间创建,例如作为Spring单例bean。
这里我使用了ClosableHttpClient,因为它使用了资源尝试语法,你需要在读完后关闭httpClient,响应和inputStream。 HttpClient实际上是一个轻量级对象,类似套接字连接和cookie的状态存储在其他地方。
我使用Spring的MediaType.parseMediaType()来获取char编码,使用Guavas CharStreams将inputStream转换为String。在我的情况下,谷歌使用latin-1编码内容,因为“搜索”在丹麦语中是“søgning”。
最后一步是使用EntityUtils.consume(entity),以确保已读取所有实体数据。如果使用连接池,这很重要,因为未读数据将导致连接被丢弃,而不是被连接管理器重用(如果您使用https,这非常重要)。
答案 1 :(得分:2)
您正在使用其主要版本的界面已更改的库。您无法随意复制广告并复制/粘贴示例,而无需了解您正在使用的版本以及发布示例或代码段的版本。
查看最新版本附带的示例,并带走任何陈旧的东西。
Apache似乎特别快。