HttpClient的使用和封装
HttpClient介绍
HTTP 协议是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。
使用HttpClient发送请求有如下几步:
1. 创建HttpClient对象。
2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParamsparams)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4. 调用HttpClient对象的execute(HttpUriRequestrequest)发送请求,该方法返回一个HttpResponse。
5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
6. 释放连接。无论执行方法是否成功,都必须释放连接
请求网页
package com.cloud.day1; import java.io.IOException; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; /** * 根据HTTP协议请求网页 */ public class Demo1 { public static void main(String[] args) throws HttpException, IOException { //创建客户端的请求 HttpClient client = new HttpClient(); //创建一个get请求 HttpMethod method = new GetMethod("http://www.baidu.com"); //创建一个post请求 HttpMethod method2 = new PostMethod("http://www.baidu.com"); //客户端发送请求 client.executeMethod(method); client.executeMethod(method2); System.out.println("--------------Get请求返回信息----------"); System.out.println("get:"+method.getStatusLine()); System.out.println("get:"+method.getResponseBodyAsString()); System.out.println("--------------Post请求返回信息---------"); System.out.println("post:"+method2.getStatusLine()); System.out.println("post:"+method2.getResponseBodyAsString()); //释放连接 method.releaseConnection(); method2.releaseConnection(); } } |
下载网络图片
package com.cloud.day1; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.GetMethod; /** * 根据图片的URL地址,从网上下载图片 */ public class Demo2 { public static void main(String[] args) { downImage("http://d.3987.com/lmxj_130510/005.jpg"); } public static void downImage(String postUrl){ HttpClient client = new HttpClient(); GetMethod getMethod = new GetMethod(postUrl); FileOutputStream fos; try{ client.executeMethod(getMethod); String name = new SimpleDateFormat("yyyyMMdd HHmmss").format(new Date()); File outfile = new File("E:/"+name+".jpg"); fos = new FileOutputStream(outfile); InputStream inputStream = getMethod.getResponseBodyAsStream(); byte[] b = new byte[1024]; int len = 0; while((len=inputStream.read(b))!=-1){ fos.write(b,0,len); } inputStream.close(); fos.close(); } catch(Exception e){ e.printStackTrace(); } finally{ getMethod.releaseConnection(); } } } |
模拟用户登录
package com.cloud.day1; import java.io.IOException; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.params.HttpClientParams; /** * POST方式提交表单,模拟用户的登录请求 */ public class Demo3 { public static void main(String[] args) throws HttpException, IOException { postForm(); } public static void postForm() throws HttpException, IOException{ HttpClient httpClient = new HttpClient(); PostMethod postMethod = new PostMethod("http://localhost:8080/QuartzTest/getData/login.do"); String userName = "spring"; String passWord = "123"; HttpClientParams params = new HttpClientParams(); params.setSoTimeout(30000); httpClient.setParams(params); NameValuePair uname = new NameValuePair(userName, userName); NameValuePair pword = new NameValuePair(passWord, passWord); NameValuePair[] data = {uname,pword}; postMethod.setRequestBody(data); httpClient.executeMethod(postMethod); System.out.println(postMethod.getResponseBodyAsString()); } } |
查询号码归属地
package com.cloud.day1; import java.io.IOException; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; /** * 根据POST请求,查询号码的归属地 */ public class Demo4 { /** * @param args * @throws HttpException * @throws IOException */ public static void main(String[] args) throws HttpException, IOException { HttpClient httpClient = new HttpClient(); httpClient.getHostConfiguration().setHost("www.114best.com" , 80, "http" ); HttpMethod method = postMethod(); httpClient.executeMethod(method); System.out.println("1:"+method.getStatusLine()); String response = new String(method.getResponseBodyAsString()); System.out.println("2:"+response); method.releaseConnection(); } /** * GET方式提交的数据 * @return HttpMethod */ @SuppressWarnings("unused") private static HttpMethod getMethod(){ return new GetMethod("/simcard.php?simcard=1330227"); } /** * 使用POST方式提交数据 * @return HttpMethod */ private static HttpMethod postMethod(){ //这里根据网址上面拼接查询参数 PostMethod post = new PostMethod("/dh/114.aspx"); NameValuePair w = new NameValuePair("w","18225896837"); post.setRequestBody(new NameValuePair[]{w}); return post; } } |
Java系统中封装HttpClient
package com.cloud.day1; import java.util.Map; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.params.HttpMethodParams; /** * 把HttpClient功能封装 * 发送请求,回传请求结果 */ public class Demo5 { } class AppPostRequest{ //请求参数 public Map<String, String> params; //请求URL public String url; //时间格式 public String dataFormart = "yyyy-MM-dd HH:mm:ss"; //连接超时 public int connectionTimeout = 6000; //读取超时 public int readTimeOut = 3000; //几个构造方法 public AppPostRequest(){ super(); } public AppPostRequest(Map<String, String> params,String url){ super(); this.params = params; this.url = url; } public AppPostRequest(String dataFormart,Map<String, String> params,String url){ super(); this.dataFormart = dataFormart; this.params = params; this.url = url; } public AppPostRequest(int connectionTimeout,int readTimeOut,String dataFormat,Map<String, String> params,String url){ super(); this.connectionTimeout = connectionTimeout; this.readTimeOut = readTimeOut; this.dataFormart = dataFormat; this.params = params; this.url = url; } //执行请求处理 public String execute(){ PostMethod post = new PostMethod(url); String returnStr=""; try { post.setRequestBody(getPair()); HttpClient client = new HttpClient(); //指定编码 client.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8"); //设置超时 client.getHttpConnectionManager().getParams().setConnectionTimeout(30000); client.getHttpConnectionManager().getParams().setSoTimeout(30000); client.getParams().setSoTimeout(30000); client.getParams().setConnectionManagerTimeout(30000); client.getParams().setBooleanParameter("http.protocol.expect-continue", false); //设置请求头关闭连接 post.addRequestHeader("Connection", "close"); //执行请求 client.executeMethod(post); //返回请求结果 returnStr = post.getResponseBodyAsString(); } catch (Exception e) { e.printStackTrace(); } finally{ //关闭连接 post.releaseConnection(); } return returnStr; } //数据处理 public NameValuePair[] getPair(){ NameValuePair[] param = new NameValuePair[params.size()]; int i = 0; for(String key:params.keySet()){ NameValuePair pValue = new NameValuePair(key,String.valueOf(params.get(key))); param[i] = pValue; i++; } return param; } } |