HttpClient 学习
HttpClient 简介
HTTP 协议应该是Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
HTTP协议
的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。
由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
使用方法
通过Maven 导出需要的jar包:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
-
创建HttpClient对象,最新版的httpClient使用实现类的是closeableHTTPClient,以前的default作废了。
-
创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
-
调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
-
调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
-
释放连接。无论执行方法是否成功,都必须释放连接
public class HttpClientExample {
//// http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255
String url="ip.taobao.com/service/getIpInfo.php";
public static void getMethod(String url,String ip)
{
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("ip", ip));
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
InputStream is = null;
String str;
try {
str = EntityUtils.toString(new UrlEncodedFormEntity(params, Consts.UTF_8));
// 创建Get请求
HttpGet httpPost = new HttpGet(url + "?" + str);
// 执行Get请求,
response = httpClient.execute(httpPost);
// 得到响应体
HttpEntity entity = response.getEntity();
if (entity != null) {
is = entity.getContent();
// 转换为字节输入流
BufferedReader br = new BufferedReader(new InputStreamReader(is, Consts.UTF_8));
StringBuilder sb = new StringBuilder();
String body = null;
while ((body = br.readLine()) != null) {
sb.append(body);
}
//Map mapTypes = JSON.parseObject(sb.toString());
System.out.println(sb);
// System.out.println(mapTypes.get("code"));
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 关闭输入流,释放资源
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
// 消耗实体内容
if (response != null) {
try {
response.close();
} catch (IOException e) {
}
}
// 关闭相应 丢弃http连接
if (httpClient != null) {
try {
httpClient.close();
} catch (IOException e) {
}
}
}
}
public static void main(String args[]) throws IOException{
// http://ip.taobao.com/service/getIpInfo.php?ip=118.187.25.137
String ip="118.187.25.137";
HttpClientExample.getMethod("http://ip.taobao.com/service/getIpInfo.php", ip);
}
}
{"code":0,"data":{"ip":"118.187.25.137","country":"中国","area":"","region":"北京","city":"北
京","county":"XX","isp":"电
信","country_id":"CN","area_id":"","region_id":"110000","city_id":"110100","county_id":"xx","isp_id":"100017"}}