HttpClient是目前我们通讯组件中最常见的一个Api了吧。至少从我目前接触到与外部系统通讯的话是这样的。下面我将我自己常用的一些知识总结一下。

因为本猿也是边写边总结,有啥不对的还望多多指出。

1:利用httpClient发送https请求。

第一次遇到这种情况是开发与微信支付的接口。适用情形https请求,报文格式:字符串(包含json字符串和xml字符串)。

public String doPost(String url,String charset,String reqXmlData){
  HttpClient httpClient = null;
  HttpPost httpPost = null;
  String result = null;
  try{
   //这里是关键,SSLClient继承了DefaultHttpClient 忽略https校验过程。SSLClient具体如下。
   httpClient = new SSLClient();
   logger.info("call weixin pay url:"+url);
   httpPost = new HttpPost(url);
   logger.info("call weixin pay requestXmlData:"+reqXmlData);
   //设置最简单的字符串请求参数
   StringEntity strEntity = new StringEntity(reqXmlData, charset);
   httpPost.setEntity(strEntity);
   HttpResponse response = httpClient.execute(httpPost);
   int code = response.getStatusLine().getStatusCode();   
   if(code == 200){
    HttpEntity resEntity = response.getEntity();
    if(resEntity != null){
     result = EntityUtils.toString(resEntity,charset);
    }
   }else{
    //这里就不对其他code处理了
   }
   logger.info("call weixin pay responseXmlData:"+result);
  }catch(Exception ex){
   ex.printStackTrace();
  }finally{
   if (httpClient != null){
    httpClient = null;
   }
  }
  return result;
 }

/**
 * 用于进行Https请求的HttpClient
 */
public class SSLClient extends DefaultHttpClient{
 public SSLClient() throws Exception{
        super();
        SSLContext ctx = SSLContext.getInstance("TLS");
        X509TrustManager tm = new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] chain,
                        String authType) throws CertificateException {
                }
                @Override
                public void checkServerTrusted(X509Certificate[] chain,
                        String authType) throws CertificateException {
                }
                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
        };
        ctx.init(null, new TrustManager[]{tm}, null);
        SSLSocketFactory ssf = new SSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        ClientConnectionManager ccm = this.getConnectionManager();
        SchemeRegistry sr = ccm.getSchemeRegistry();
        sr.register(new Scheme("https", 443, ssf));
    }
}

好了,今天就先更新到这里了。下班肥家。20151207

第二点:利用httpclient来模拟表单提交(兼容http请求和https请求)

相信有很多人遇到过和我一样的情形,与外部系统对接时。经常是测试环境使用的是http请求而生产正式环境则是https请求。这时候我是这样做的。

public static String httpPost(String reqUrl, BaseDto baseDto){
  DefaultHttpClient httpclient = new DefaultHttpClient();
  String result = "";
   try {
    if(reqUrl.startsWith("https")){
     logger.debug("请求地址为https请求");
     httpclient = new SSLClient();
    }

 //设置超时时间
    httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, TIME_OUT * 1000);
    httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, TIME_OUT * 1000);
    HttpPost httppost = new HttpPost(reqUrl);
    logger.debug("调用地址"+reqUrl);

//定义一个用来存储表单数据的集合
    List<BasicNameValuePair> formParams = new ArrayList<BasicNameValuePair>();
    formParams.add(new BasicNameValuePair("merchant_id", baseDto.getMerchant_id()));
    formParams.add(new BasicNameValuePair("key_enc", baseDto.getKey_enc()));
    formParams.add(new BasicNameValuePair("sign", baseDto.getSign()));
    formParams.add(new BasicNameValuePair("xml_enc", baseDto.getXml_enc()));

//UrlEncodedFormEntity与StringEntity相比较的话只能接受键值对的形式,试用与表单提交
    HttpEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");
    httppost.setEntity(entity);
    HttpResponse response=httpclient.execute(httppost);
    int httpCode = response.getStatusLine().getStatusCode();
    logger.debug("返回的code:"+httpCode);
    switch (httpCode) {
    case 200:
     HttpEntity resEntity=response.getEntity();
     result = EntityUtils.toString(resEntity,"UTF-8");
     logger.debug("通讯原始结果:"+result);
     return result;
    case 401:
     logger.debug("请求要求进行身份验证");
    case 403:
     logger.debug("请求被拒绝,请检查IP地址是否已经加入对方白名单");
    case 404:
     logger.debug("未找到,服务器找不到请求的地址");
    case 405:
     logger.debug("方法不允许,请确认是否为POST请求方式");
    case 500:
     logger.debug("查询请求失败,内部错误");
    default:
     logger.debug("未知的返回码:" + httpCode);
    }
   }  catch (Exception e) {
    e.printStackTrace();
    throw new ServiceException(e,"0006","获取渠道返回信息失败了,可能是超时了");
   }
 }

好了,今天就先更新到这里了,后面继续来整理利用httpclient来进行爬虫。httpclient的超时设置等等。20151208

HttpClient常用的一些常识的更多相关文章

  1. Go - httpclient 常用操作

    httpclient 模块介绍 httpclient 是基于 net/http  封装的 Go HTTP 客户端请求包,支持常用的请求方式.常用设置,比如: 支持设置 Mock 信息 支持设置失败时告 ...

  2. 常用javaScript小常识

    javascript数据类型强制转换 一.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 B.如果是数字,转换成为本身.将无意义的后导 ...

  3. HTTPClient模块的HttpGet和HttpPost

    HttpClient常用HttpGet和HttpPost这两个类,分别对应Get方式和Post方式. 无论是使用HttpGet,还是使用HttpPost,都必须通过如下3步来访问HTTP资源. 1.创 ...

  4. HttpClient研究学习总结

    Http协议非常的重要,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人 ...

  5. java使用HttpClient

    HttpClient常用的包有两个 org.apache.http.client以及org.apache.commons.httpclient 我常用的是org.apache.http.client. ...

  6. 8.3 TCPIP协议族

    接下来我们要学习的内容是TCP/IP协议族.TCP/IP协议族在网络系统中是非常重要的.这一个协议族当中牵涉到许许多多的我们平常所用到的协议.TCP/IP呢它也有分层模型.然后我们讲到的就是三方面的内 ...

  7. spring整合http

    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接出处:https://blog.csdn.net/qq_3076499,否则保留追究法律责任的权利. 如果 ...

  8. C#网络程序设计(1)网络编程常识与C#常用特性

        网络程序设计能够帮我们了解联网应用的底层通信原理!     (1)网络编程常识: 1)什么是网络编程 只有主要实现进程(线程)相互通信和基本的网络应用原理性(协议)功能的程序,才能算是真正的网 ...

  9. .Net Standard HttpClient封装Htt请求常用操作整理

    一.常用Http操作 1.Get请求,有参数,无参数 2.Post 请求,有参数,无参数 3.文件简单下载 修改NetHelper中Post请求方法Bug:请求编码默认UTF8,字符串内存流读取后这是 ...

  10. Httpclient 表单,json,multipart/form-data 提交 ---总结常用的方法

    最近在项目中,一直在使用HttpClient 中的方法,这里我进行一些方法的汇总,也是结合了一些大牛写的代码,以备不时之需 官话:HttpClient 是Apache Jakarta Common 下 ...

随机推荐

  1. C# WCF实现聊天室功能

    1.WCF是什么 Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架 看这篇文章之前,可以先看我的另一篇文章,初步了解一下WCF: ...

  2. EF Corexxxxnstance with the same key value for {'Id'} is already being tracked.

    AsNoTracki或者全局禁用 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // ...

  3. 前端js下载excel

    // 1.文件流下载文件: export function axiosPostExport(url, data, fileName, suffix = '.xlsx') {     url = get ...

  4. CLIP 改进工作串讲(下)学习笔记

    1.图像生成 1.1CLIPasso(semantically-aware object sketching) 将物体的照片变成简笔画的形式,希望即使有最少的线条,也能识别出来物体. 问题定义,在纸上 ...

  5. 0627.selenium请求库*1

    今日内容: 一 Selenium请求库 一 Selenium请求库 1.什么是selenium? selenium是一个自动测试工具,它可以帮我通过代码 去实现驱动浏览器自动执行相应的操作. 所以我们 ...

  6. 以图搜图(demo创建流程)

    window10添加向量数据库以及调用 创建docker 1,在windows功能中打开Hyper-V 和 容器 2,进入https://www.docker.com/ ,下载windows版本进行安 ...

  7. 杭电oj 偶数求和

    Problem Description 有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值 ...

  8. C#中实现类型对foreach的支持

    代码实现: 首先创建用来遍历的类 class Car { public string name; public int age; } public class Cars: IEnumerable { ...

  9. 【安全记录】certutil实战使用总结

    前言 在先知看到一篇关于certutil命令的文章(关于certutil的探究),讲得很详细.很全面.特此记录下本人在渗透时使用certutil的一些方法. 在cmd下使用certutil下载远程文件 ...

  10. pve apt 更新

    解决pve6.2/pve6.3 安装ifupdown2,失败问题 https://www.cnblogs.com/lovesKey/p/14400874.html https://blog.whsir ...