HTTP协议,httpclient协议

Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入。

一、简介
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。

下载地址: http://hc.apache.org/downloads.cgi

二、特性
1. 基于标准、纯净的java语言。实现了Http1.0和Http1.1

2. 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。

3. 支持HTTPS协议。

4. 通过Http代理建立透明的连接。

5. 利用CONNECT方法通过Http代理建立隧道的https连接。

6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。

7. 插件式的自定义认证方案。

8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。

9. 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。

10. 自动处理Set-Cookie中的Cookie。

11. 插件式的自定义Cookie策略。

12. Request的输出流可以避免流中内容直接缓冲到socket服务器。

13. Response的输入流可以有效的从socket服务器直接读取相应内容。

14. 在http1.0和http1.1中利用KeepAlive保持持久连接。

15. 直接获取服务器发送的response code和 headers。

16. 设置连接超时的能力。

17. 实验性的支持http1.1 response caching。

18. 源代码基于Apache License 可免费获取。

三、使用方法

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。
1. 创建HttpClient对象。

2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

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

5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

6. 释放连接。无论执行方法是否成功,都必须释放连接

四、实例
[java] view plain copy
package com.test;  

import java.io.File;  
import java.io.FileInputStream;  
import java.io.IOException;  
import java.io.UnsupportedEncodingException;  
import java.security.KeyManagementException;  
import java.security.KeyStore;  
import java.security.KeyStoreException;  
import java.security.NoSuchAlgorithmException;  
import java.security.cert.CertificateException;  
import java.util.ArrayList;  
import java.util.List;  

import javax.net.ssl.SSLContext;  

import org.apache.http.HttpEntity;  
import org.apache.http.NameValuePair;  
import org.apache.http.ParseException;  
import org.apache.http.client.ClientProtocolException;  
import org.apache.http.client.entity.UrlEncodedFormEntity;  
import org.apache.http.client.methods.CloseableHttpResponse;  
import org.apache.http.client.methods.HttpGet;  
import org.apache.http.client.methods.HttpPost;  
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;  
import org.apache.http.conn.ssl.SSLContexts;  
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;  
import org.apache.http.entity.ContentType;  
import org.apache.http.entity.mime.MultipartEntityBuilder;  
import org.apache.http.entity.mime.content.FileBody;  
import org.apache.http.entity.mime.content.StringBody;  
import org.apache.http.impl.client.CloseableHttpClient;  
import org.apache.http.impl.client.HttpClients;  
import org.apache.http.message.BasicNameValuePair;  
import org.apache.http.util.EntityUtils;  
import org.junit.Test;  

public class HttpClientTest {  

@Test  
public void jUnitTest() {  
    get();  
}  

/** 
 * HttpClient连接SSL 
 */  
public void ssl() {  
    CloseableHttpClient httpclient = null;  
    try {  
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());  
        FileInputStream instream = new FileInputStream(new File("d:\\tomcat.keystore"));  
        try {  
            // 加载keyStore d:\\tomcat.keystore    
            trustStore.load(instream, "123456".toCharArray());  
        } catch (CertificateException e) {  
            e.printStackTrace();  
        } finally {  
            try {  
                instream.close();  
            } catch (Exception ignore) {  
            }  
        }  
        // 相信自己的CA和所有自签名的证书  
        SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build();  
        // 只允许使用TLSv1协议  
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,  
                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);  
        httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();  
        // 创建http请求(get方式)  
        HttpGet httpget = new HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action");  
        System.out.println("executing request" + httpget.getRequestLine());  
        CloseableHttpResponse response = httpclient.execute(httpget);  
        try {  
            HttpEntity entity = response.getEntity();  
            System.out.println("----------------------------------------");  
            System.out.println(response.getStatusLine());  
            if (entity != null) {  
                System.out.println("Response content length: " + entity.getContentLength());  
                System.out.println(EntityUtils.toString(entity));  
                EntityUtils.consume(entity);  
            }  
        } finally {  
            response.close();  
        }  
    } catch (ParseException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } catch (KeyManagementException e) {  
        e.printStackTrace();  
    } catch (NoSuchAlgorithmException e) {  
        e.printStackTrace();  
    } catch (KeyStoreException e) {  
        e.printStackTrace();  
    } finally {  
        if (httpclient != null) {  
            try {  
                httpclient.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
}  

/** 
 * post方式提交表单(模拟用户登录请求) 
 */  
public void postForm() {  
    // 创建默认的httpClient实例.    
    CloseableHttpClient httpclient = HttpClients.createDefault();  
    // 创建httppost    
    HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");  
    // 创建参数队列    
    List<namevaluepair> formparams = new ArrayList<namevaluepair>();  
    formparams.add(new BasicNameValuePair("username", "admin"));  
    formparams.add(new BasicNameValuePair("password", "123456"));  
    UrlEncodedFormEntity uefEntity;  
    try {  
        uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");  
        httppost.setEntity(uefEntity);  
        System.out.println("executing request " + httppost.getURI());  
        CloseableHttpResponse response = httpclient.execute(httppost);  
        try {  
            HttpEntity entity = response.getEntity();  
            if (entity != null) {  
                System.out.println("--------------------------------------");  
                System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));  
                System.out.println("--------------------------------------");  
            }  
        } finally {  
            response.close();  
        }  
    } catch (ClientProtocolException e) {  
        e.printStackTrace();  
    } catch (UnsupportedEncodingException e1) {  
        e1.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } finally {  
        // 关闭连接,释放资源    
        try {  
            httpclient.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}  

/** 
 * 发送 post请求访问本地应用并根据传递参数不同返回不同结果 
 */  
public void post() {  
    // 创建默认的httpClient实例.    
    CloseableHttpClient httpclient = HttpClients.createDefault();  
    // 创建httppost    
    HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");  
    // 创建参数队列    
    List<namevaluepair> formparams = new ArrayList<namevaluepair>();  
    formparams.add(new BasicNameValuePair("type", "house"));  
    UrlEncodedFormEntity uefEntity;  
    try {  
        uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");  
        httppost.setEntity(uefEntity);  
        System.out.println("executing request " + httppost.getURI());  
        CloseableHttpResponse response = httpclient.execute(httppost);  
        try {  
            HttpEntity entity = response.getEntity();  
            if (entity != null) {  
                System.out.println("--------------------------------------");  
                System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));  
                System.out.println("--------------------------------------");  
            }  
        } finally {  
            response.close();  
        }  
    } catch (ClientProtocolException e) {  
        e.printStackTrace();  
    } catch (UnsupportedEncodingException e1) {  
        e1.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } finally {  
        // 关闭连接,释放资源    
        try {  
            httpclient.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}


/**
*post
*/

请求方法
String requestUrl = Weather.SQ_AREA_ROAD_URL+"?appKey="+Weather.SQ_AK;
    System.out.println("----requestUrl----"+requestUrl);
    Map params = new HashMap();
    List subParamList = new ArrayList();
    Map map = new HashMap();
    map.put("longitude","1163583362");
    map.put("latitude","398585453");
    subParamList.add(map);
    params.put("trajCount", "63");
    params.put("subParam",subParamList);
    String httpEntity = new HttpUtil().post(requestUrl, JSONObject.toJSONString(params));

工具方法
public String post(String url,String requestBody) {
    //请求的body信息
    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost(url);
    //添加header
    httpPost.addHeader("Content-type", "application/json; charset=utf-8");
    httpPost.setHeader("Accept", "application/json");
    //添加body
    ByteArrayEntity entity = null;
    try {
        entity = new ByteArrayEntity(requestBody.getBytes("UTF-8"));
        entity.setContentType("application/json");
    } catch (UnsupportedEncodingException e) {
        throw new RuntimeException("向服务器承保接口发起http请求,封装请求body时出现异常", e);
    }
    httpPost.setEntity(entity);
    //执行post请求
    HttpResponse response = null;
    String obj = null;
    try {
        response = httpClient.execute(httpPost);
        HttpEntity entit = response.getEntity();
        if (entit != null) {
             obj=EntityUtils.toString(entit, "UTF-8");
        }
    } catch (ClientProtocolException e) {
        throw new RuntimeException("提交给服务器的请求,不符合HTTP协议", e);
    } catch (IOException e) {
        throw new RuntimeException("向服务器承保接口发起http请求,执行post请求异常", e);
    }
    return obj;
}


/** 
 * 发送 get请求 
 */  
public void get() {  
    CloseableHttpClient httpclient = HttpClients.createDefault();  
    try {  
        // 创建httpget.    
        HttpGet httpget = new HttpGet("http://www.baidu.com/");  
        System.out.println("executing request " + httpget.getURI());  
        // 执行get请求.    
        CloseableHttpResponse response = httpclient.execute(httpget);  
        try {  
            // 获取响应实体    
            HttpEntity entity = response.getEntity();  
            System.out.println("--------------------------------------");  
            // 打印响应状态    
            System.out.println(response.getStatusLine());  
            if (entity != null) {  
                // 打印响应内容长度    
                System.out.println("Response content length: " + entity.getContentLength());  
                // 打印响应内容    
                System.out.println("Response content: " + EntityUtils.toString(entity));  
            }  
            System.out.println("------------------------------------");  
        } finally {  
            response.close();  
        }  
    } catch (ClientProtocolException e) {  
        e.printStackTrace();  
    } catch (ParseException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } finally {  
        // 关闭连接,释放资源    
        try {  
            httpclient.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}  

/** 
 * 上传文件 
 */  
public void upload() {  
    CloseableHttpClient httpclient = HttpClients.createDefault();  
    try {  
        HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceFile.action");  

        FileBody bin = new FileBody(new File("F:\\image\\sendpix0.jpg"));  
        StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN);  

        HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("bin", bin).addPart("comment", comment).build();  

        httppost.setEntity(reqEntity);  

        System.out.println("executing request " + httppost.getRequestLine());  
        CloseableHttpResponse response = httpclient.execute(httppost);  
        try {  
            System.out.println("----------------------------------------");  
            System.out.println(response.getStatusLine());  
            HttpEntity resEntity = response.getEntity();  
            if (resEntity != null) {  
                System.out.println("Response content length: " + resEntity.getContentLength());  
            }  
            EntityUtils.consume(resEntity);  
        } finally {  
            response.close();  
        }  
    } catch (ClientProtocolException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } finally {  
        try {  
            httpclient.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}  

}
本实例是采用HttpClient4.3最新版本。该版本与之前的代码写法风格相差较大,大家多留意下。

项目中自用的方法
urlStr:url
content:内容
encoding:编码格式
method:提交方式

public static String getResult(String urlStr, String content, String encoding,String method) {
          URL url = null;
          HttpURLConnection connection = null;
          try {
             url = new URL(urlStr);
             connection = (HttpURLConnection) url.openConnection();// 新建连接实例
             connection.setConnectTimeout(10000);// 设置连接超时时间,单位毫秒
             connection.setReadTimeout(10000);// 设置读取数据超时时间,单位毫秒
             connection.setDoOutput(true);// 是否打开输出流 true|false
             connection.setDoInput(true);// 是否打开输入流true|false
             connection.setRequestMethod(method);// 提交方法POST|GET
             connection.setUseCaches(false);// 是否缓存true|false
             connection.connect();// 打开连接端口
             DataOutputStream out = new DataOutputStream(connection.getOutputStream());// 打开输出流往对端服务器写数据
             out.writeBytes(content);// 写数据,也就是提交你的表单 name=xxx&pwd=xxx
             out.flush();// 刷新
             out.close();// 关闭输出流
             BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding));
             StringBuffer buffer = new StringBuffer();
             String line = "";
             while ((line = reader.readLine()) != null) {
                 buffer.append(line);
             }
             reader.close();
             return buffer.toString();
         } catch (IOException e) {
             e.printStackTrace();
         } finally {
             if (connection != null) {
                 connection.disconnect();// 关闭连接
             }
         }
         return null;
     }

自己用过的方法

	 public static String getAdd(String log, String lat ){ 
	    //lat 小 log 大 
	    //参数解释: 纬度,经度 type 001 (100代表道路,010代表POI,001代表门址,111可以同时显示前三项) 
	    String urlString = "http://api.map.baidu.com/geocoder/v2/?address=北京市&output=json&ak=0GjzOTbAlqySzHYIudYG7V1WY3LLeD61&callback=showLocation"; 
	    String res = "";   
	    try {   
	      URL url = new URL(urlString);  
	      java.net.HttpURLConnection conn = (java.net.HttpURLConnection)url.openConnection();  
	      conn.setDoOutput(true);  
	      conn.setRequestMethod("POST");  
	      java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(conn.getInputStream(),"UTF-8"));  
	      String line;  
	      while ((line = in.readLine()) != null) {  
	        res += line+"\n";  
	     }  
	      in.close();  
	    } catch (Exception e) {  
	      System.out.println("error in wapaction,and e is " + e.getMessage());  
	    }  
	    System.out.println(res); 
	    return res;  
	  } 

post请求

public static void post(String url,String param) throws IOException {
    CloseableHttpClient client = HttpClients.createDefault();
    UrlEncodedFormEntity entity = null;
    try {

        HttpPost put = new HttpPost(url);
        put.setHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
        List<NameValuePair>list = new ArrayList<NameValuePair>();
        list.add(new BasicNameValuePair("param",param));

        entity = new UrlEncodedFormEntity(list,"UTF-8");
        put.setEntity(entity);
        CloseableHttpResponse response = client.execute(put);
        HttpEntity et = response.getEntity();
        InputStream in = et.getContent();
        int stat=  response.getStatusLine().getStatusCode();

    } catch (Exception e) {

        e.printStackTrace();
    }finally{
        client.close();
    }
}

将参数分装成json请求http数据

public static String sendSmsByPost(String path, String postContent) {
        URL url = null;
        try {
            url = new URL(path);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");// 提交模式
            httpURLConnection.setConnectTimeout(10000);//连接超时 单位毫秒
            httpURLConnection.setReadTimeout(10000);//读取超时 单位毫秒
            // 发送POST请求必须设置如下两行
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            httpURLConnection.setRequestProperty("Charset", "UTF-8");
            httpURLConnection.setRequestProperty("Content-Type", "application/json");

//			PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
//			printWriter.write(postContent);
//			printWriter.flush();

            httpURLConnection.connect();
            OutputStream os=httpURLConnection.getOutputStream();
            os.write(postContent.getBytes("UTF-8"));
            os.flush();

            StringBuilder sb = new StringBuilder();
            int httpRspCode = httpURLConnection.getResponseCode();
            if (httpRspCode == HttpURLConnection.HTTP_OK) {
                // 开始获取数据
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(httpURLConnection.getInputStream(), "utf-8"));
                String line = null;
                while ((line = br.readLine()) != null) {
                    sb.append(line);
                }
                br.close();
                return sb.toString();

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

``

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值