HttpClient的使用和封装

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. 如果需要发送请求参数,可调用HttpGetHttpPost共同的setParams(HetpParamsparams)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

4. 调用HttpClient对象的execute(HttpUriRequestrequest)发送请求,该方法返回一个HttpResponse

5. 调用HttpResponsegetAllHeaders()getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponsegetEntity()方法可获取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;

   }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值