一,基础的的应用

1.1,get的无参请求

     @Test
     public void doGet() throws Exception {
         //创建一个httpclient对象
         CloseableHttpClient httpClient = HttpClients.createDefault();
         //创建一个GET对象
         HttpGet get = new HttpGet("http://www.sogou.com");
         //执行请求
         CloseableHttpResponse response = httpClient.execute(get);
         //取响应的结果
         int statusCode = response.getStatusLine().getStatusCode();
         System.out.println(statusCode);
         HttpEntity entity = response.getEntity();
         String string = EntityUtils.toString(entity, "utf-8");
         System.out.println(string);
         //关闭httpclient
         response.close();
         httpClient.close();
     }

1.2,get的带参请求

 public void doGetWithParam() throws Exception{
         //创建一个httpclient对象
         CloseableHttpClient httpClient = HttpClients.createDefault();
         //创建一个uri对象
         URIBuilder uriBuilder = new URIBuilder("http://www.sogou.com/web");
         uriBuilder.addParameter("query", "花千骨");
         HttpGet get = new HttpGet(uriBuilder.build());
         //执行请求
         CloseableHttpResponse response = httpClient.execute(get);
         //取响应的结果
         int statusCode = response.getStatusLine().getStatusCode();
         System.out.println(statusCode);
         HttpEntity entity = response.getEntity();
         String string = EntityUtils.toString(entity, "utf-8");
         System.out.println(string);
         //关闭httpclient
         response.close();
         httpClient.close();
     }

1.3,post的无参请求

 public void doPost() throws Exception {
         CloseableHttpClient httpClient = HttpClients.createDefault();

         //创建一个post对象
         HttpPost post = new HttpPost("http://localhost:8082/httpclient/post.action");
         //执行post请求
         CloseableHttpResponse response = httpClient.execute(post);
         String string = EntityUtils.toString(response.getEntity());
         System.out.println(string);
         response.close();
         httpClient.close();

     }

1.4.1,post的带参请求

 public void doPostWithParam() throws Exception{
         CloseableHttpClient httpClient = HttpClients.createDefault();

         //创建一个post对象
         HttpPost post = new HttpPost("http://localhost:8082/httpclient/post.action");
         //创建一个Entity。模拟一个表单
         List<NameValuePair> kvList = new ArrayList<>();
         kvList.add(new BasicNameValuePair("username", "张三"));
         kvList.add(new BasicNameValuePair("password", "123"));

         //包装成一个Entity对象
         StringEntity entity = new UrlEncodedFormEntity(kvList, "utf-8");
         //设置请求的内容
         post.setEntity(entity);

         //执行post请求
         CloseableHttpResponse response = httpClient.execute(post);
         String string = EntityUtils.toString(response.getEntity());
         System.out.println(string);
         response.close();
         httpClient.close();
     }

1.4.2,post的请求服务器8082的写法

 @RequestMapping(value="/httpclient/post", method=RequestMethod.POST,
             produces=MediaType.TEXT_PLAIN_VALUE+";charset=utf-8")
     @ResponseBody
     public String testPost(String username, String password) {
         String result = "username:" + username + "\tpassword:" + password;
         System.out.println(result);
         return "username:" + username + ",password:" + password;
     }

二,httpclient的工具封装

2.1,get的带参和无参的工具类

     public static String doGet(String url, Map<String, String> param) {

         // 创建Httpclient对象
         CloseableHttpClient httpclient = HttpClients.createDefault();

         String resultString = "";
         CloseableHttpResponse response = null;
         try {
             // 创建uri
             URIBuilder builder = new URIBuilder(url);
             if (param != null) {
                 for (String key : param.keySet()) {
                     builder.addParameter(key, param.get(key));
                 }
             }
             URI uri = builder.build();

             // 创建http GET请求
             HttpGet httpGet = new HttpGet(uri);

             // 执行请求
             response = httpclient.execute(httpGet);
             // 判断返回状态是否为200
             if (response.getStatusLine().getStatusCode() == 200) {
                 resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
             }
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             try {
                 if (response != null) {
                     response.close();
                 }
                 httpclient.close();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
         return resultString;
     }

     public static String doGet(String url) {
         return doGet(url, null);
     }

2.2,post的带参和无参的工具类 (参数的数据类型是map)

 public static String doPost(String url, Map<String, String> param) {
         // 创建Httpclient对象
         CloseableHttpClient httpClient = HttpClients.createDefault();
         CloseableHttpResponse response = null;
         String resultString = "";
         try {
             // 创建Http Post请求
             HttpPost httpPost = new HttpPost(url);
             // 创建参数列表
             if (param != null) {
                 List<NameValuePair> paramList = new ArrayList<>();
                 for (String key : param.keySet()) {
                     paramList.add(new BasicNameValuePair(key, param.get(key)));
                 }
                 // 模拟表单
                 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
                 httpPost.setEntity(entity);
             }
             // 执行http请求
             response = httpClient.execute(httpPost);
             resultString = EntityUtils.toString(response.getEntity(), "utf-8");
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             try {
                 response.close();
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }

         return resultString;
     }

     public static String doPost(String url) {
         return doPost(url, null);
     }
     

2.3,post的带参的请求(参数类型是json格式的数据)

 public static String doPostJson(String url, String json) {
         // 创建Httpclient对象
         CloseableHttpClient httpClient = HttpClients.createDefault();
         CloseableHttpResponse response = null;
         String resultString = "";
         try {
             // 创建Http Post请求
             HttpPost httpPost = new HttpPost(url);
             // 创建请求内容
             StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
             httpPost.setEntity(entity);
             // 执行http请求
             response = httpClient.execute(httpPost);
             resultString = EntityUtils.toString(response.getEntity(), "utf-8");
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             try {
                 response.close();
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }

         return resultString;
     }

三,项目中的案例解析 (调用其它公司的图像识别为例)

3.1,调用的服务层的方法(第一个参数不一样,说明识别的证件不一样)

     private OcrServer ocrServer = null;

     @Override
     public Map<String, Object> idCardRecognize(MultipartFile imageFile) {
         return ocrServer.pictureRecognition("IdCard", imageFile);
     }

     @Override
     public Map<String, Object> bankCardRecognize(MultipartFile imageFile) {
         return ocrServer.pictureRecognition("BankCard", imageFile);
     }

     @Override
     public Map<String, Object> veCardRecognize(MultipartFile imageFile) {
         return ocrServer.pictureRecognition("VeCard", imageFile);
     }

     @Override
     public Map<String, Object> driverCardRecognize(MultipartFile imageFile) {
         return ocrServer.pictureRecognition("DriverCard", imageFile);
     }

     @Override
     public Map<String, Object> businessLicenseRecognize(MultipartFile imageFile) {
         return ocrServer.pictureRecognition("BusinessLicense", imageFile);
     }

     @Override
     public Map<String, Object> ocrRecognize(String recotype,
             MultipartFile imageFile) {
         return ocrServer.pictureRecognition(recotype, imageFile);
     }

     public void setOcrServer(OcrServer ocrServer) {
         this.ocrServer = ocrServer;
     }

3.2,参数的封装,url的确定

 public Map<String, Object> pictureRecognition(String recotype, MultipartFile imageFile) {
         long begin = System.currentTimeMillis();
         String result = null;
         // 文件输入流
         FileInputStream fs = null;
         try {
             String configValue = cpConfigService.getValueByConfigKey("ocr_server_config", "{'uri':'http://cloud.exocr.com/recognize','username':'test','password':'test'}");
             Map<String, String> configMap = JsonUtils.json2Map2(configValue);
             String postUrl = configMap.get("uri"); // 服务地址
             Map<String, String> postParam = new HashMap<String, String>(10);
             postParam.put("username", configMap.get("username")); // 用户名, 公有云测试可使用’test’
             postParam.put("password", configMap.get("password")); // 密码,公有云测试可使用 ’test’
             postParam.put("recotype", recotype); // BankCard
             postParam.put("encoding", "utf-8"); // 返回结果的文字编码方式,取值包括:utf-8, 默认值 gb2312
             postParam.put("head_portrait", "0"); // 是否返回头像(base64格式),只对身份证识别有效,取值范围:0,默认,不返回头像    1,则返回身份证的头像照片
             postParam.put("crop_image", "0"); // 是否返回切边(base64格式),取值:0,    默认,不返回切边图    1,    返回切边图
             postParam.put("b64", "1"); // 输入图片是否为base64格式,取值:0,    默认,二进制格式   1,    base64格式
             // base64编码图像
             String base64 = new String(Base64.encodeBase64(imageFile.getBytes()));
             postParam.put("image", base64); // 待识别的图像,可以是二进制也可以是base64格式
             result = HttpUtil.postUrlAsString(postUrl, postParam, null, "utf-8");
             logger.info("OCR识别结果{}", result);
         } catch (Exception e) {
             logger.error("OCR识别异常:", e);
             StringBuilder sb = new StringBuilder();
             sb.append("{'Error':'99','Details':'OCR识别异常:");
             sb.append(e.getMessage()).append("'}");
             result = sb.toString();
         } finally {
             if (null != fs) {
                 try {
                     fs.close();
                 } catch (IOException e) {
                     logger.error("File input stream close exception:", e);
                 }
             }
         }
         // 记录接口调用耗时
         logger.info("OCR服务调用耗时{},识别类型{}", System.currentTimeMillis() - begin, recotype);

         try {
             return JsonUtils.json2Map(result);
         } catch (Exception e) {
             logger.error("json to map exception:", e);
         }

         return null;
     }

 在这里假如没有特殊的请求的话完全可以 result = HttpUtil.postUrlAsString(postUrl, postParam, null, "utf-8")调用工具类的方法了返回的结果就是了。

     public static String postUrlAsString(String url,
             Map<String, String> params, Map<String, String> reqHeader,
             String encode) throws Exception {
         // 开始时间
         long t1 = System.currentTimeMillis();
         // 获得HttpPost对象
         HttpPost httpPost = getHttpPost(url, params, encode);
         // 发送请求
         String result = executeHttpRequest(httpPost, reqHeader, encode);
         // 结束时间
         long t2 = System.currentTimeMillis();
         // 调试信息
         logger.debug("url:" + url);
         logger.debug("params:" + params.toString());
         logger.debug("reqHeader:" + reqHeader);
         logger.debug("encode:" + encode);
         logger.debug("result:" + result);
         logger.debug("consume time:" + ((t2 - t1)));
         // 返回结果
         return result;
     } 

3.3,httppost对象的获取

   private static HttpPost getHttpPost(String url, Map<String, String> params,
             String encode) throws UnsupportedEncodingException {
         HttpPost httpPost = new HttpPost(url);
         if (params != null) {
             List<NameValuePair> form = new ArrayList<NameValuePair>();
             for (String name : params.keySet()) {
                 form.add(new BasicNameValuePair(name, params.get(name)));
             }

             UrlEncodedFormEntity entity = new UrlEncodedFormEntity(form,
                     encode);
             httpPost.setEntity(entity);
         }

         return httpPost;
     }  

3.4,把获取到的参数传递给httppost对象

 private static String executeHttpRequest(HttpUriRequest request,
             Map<String, String> reqHeader, String encode) throws Exception {
         HttpClient client = null;
         String result = null;
         try {
             // 创建HttpClient对象
             client = new DefaultHttpClient();
             // 设置连接超时时间
             client.getParams().setParameter(
                     CoreConnectionPNames.CONNECTION_TIMEOUT, 60);
             // 设置Socket超时时间
             client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,
                     36600);
             // 设置请求头信息
             if (reqHeader != null) {
                 for (String name : reqHeader.keySet()) {
                     request.addHeader(name, reqHeader.get(name));
                 }
             }
             // 获得返回结果
             HttpResponse response = client.execute(request);
             // 如果成功
             if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                 encode = StringUtils.isNotEmpty(encode) ? encode : DEFAULT_ENCODE;
                 result = EntityUtils.toString(response.getEntity(), encode);
             } else {
                 StringBuffer errorMsg = new StringBuffer();
                 errorMsg.append("httpStatus:");
                 errorMsg.append(response.getStatusLine().getStatusCode());
                 errorMsg.append(response.getStatusLine().getReasonPhrase());
                 errorMsg.append(", Header: ");
                 Header[] headers = response.getAllHeaders();
                 for (Header header : headers) {
                     errorMsg.append(header.getName());
                     errorMsg.append(":");
                     errorMsg.append(header.getValue());
                 }
                 logger.error("HttpResonse Error:" + errorMsg);
                 result = "{'Error':'98','Details':'" + errorMsg.toString() + "'}";
             }
         } catch (Exception e) {
             logger.error("http连接异常", e);
             throw new Exception("http连接异常");
         } finally {
             try {
                 client.getConnectionManager().shutdown();
             } catch (Exception e) {
                 logger.error("finally HttpClient shutdown error", e);
             }
         }
         return result;
     }  

四,总结

其实httpclient主要就是模仿浏览器来通过java代码调用另一个服务器或者应用的,其中最主要的就是url和参数,一般情况下都会用post带参的请求,有些情况下也有可能有抬头或者时间的这些额外的设置。

httpclient的get带参不带参post带参不带参的简单应用的更多相关文章

  1. UNITY自带的PACKAGE的UTILITY 里面有一个自带的FPS COUNTER

    UNITY自带的PACKAGE的UTILITY 里面有一个自带的FPS COUNTER 可用,但是脚本是保密的?

  2. php通过JavaBridge调用Java类库和不带包的自定义java类成功 但是调用带包的自定义Java类报错,该怎么解决

    php通过JavaBridge调用Java类库和不带包的自定义java类成功 但是调用带包的自定义Java类报错,Class.forName("com.mysql.jdbc.Driver&q ...

  3. vue-router 使用query传参跳转了两次(首次带参数,跳转到了不带参数)

    问题: 在做项目的过程中,使用query传参数,发现跳转过程中第一次有参数,但是路由马上又跳转了一次,然后 ?和它之后的参数都不见了 问题分析: 因为路由加载了两次 解决办法: ·1. 找到总的 la ...

  4. 学习懈怠的时候,可以运行Qt自带的Demo,或者Delphi控件自带的Demo,或者Cantu书带的源码,运行一下Boost的例子(搞C++不学习Boost/Poco/Folly绝对是一大损失,有需要使用库要第一时间想到)(在六大的痛苦经历说明,我的理论性确实不强,更适合做实践)

    这样学还不用动脑子,而且熟悉控件也需要时间,而且慢慢就找到感觉了,就可以精神抖擞的恢复斗志干活了.或者Cantu书带的源码. 并且可以使用Mac SSD运行Qt的Demo,这样运行速度快一点. 此外, ...

  5. Asp.net Core dotnet 发布类库文件 带上注释,发布预发行版,带上所有引用

    带上注释 效果图 带上所有引用 效果图 预发行版 效果图 由于微软取消了  project.json  这个json 转而用了csproj 用于保存配置 所以懵逼很大一会 资料来源 project.j ...

  6. Flutter路由跳转父级页面向子页面传参及子页面向父级页面传参

    Flutter中页面通过路由跳转传参主要分两种,一种是通过push()跳转时根据设定的参数进行传参,另一种是通过pop()返回时进行传参. 父级页面向子页面push()传参 假设从A页面跳到B页面可能 ...

  7. 用mac自带的safari浏览器下载excel文件后面自带了.exe后缀

    将 Content-Type 设为 application/vnd.ms-excel

  8. 老猪带你玩转自定义控件三——sai大神带我实现ios 8 时间滚轮控件

    ios 8 的时间滚轮控件实现了扁平化,带来很好用户体验,android没有现成控件,小弟不才,数学与算法知识不过关,顾十分苦恼,幸好在github上找到sai大神实现代码,甚为欣喜,顾把学习这个控件 ...

  9. python带你采集不可言说网站数据,并带你多重骚操作~

    前言 嗨喽,大佬们好鸭!这里是小熊猫~ 今天我们采集国内知名的shipin弹幕网站! 这里有及时的动漫新番,活跃的ACG氛围,有创意的Up主. 大家可以在这里找到许多欢乐. 目录(可根据个人情况点击你 ...

  10. python 带参与不带参装饰器的使用与流程分析/什么是装饰器/装饰器使用注意事项

    一.什么是装饰器 装饰器是用来给函数动态的添加功能的一种技术,属于一种语法糖.通俗一点讲就是:在不会影响原有函数的功能基础上,在原有函数的执行过程中额外的添加上另外一段处理逻辑 二.装饰器功能实现的技 ...

随机推荐

  1. BZOJ 1801: [Ahoi2009]chess 中国象棋 [DP 组合计数]

    http://www.lydsy.com/JudgeOnline/problem.php?id=1801 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放 ...

  2. bind,apply,call区别总结

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. C++数据结构学习之顺序表

    顺序表是数据结构中最基本也是应用相当广泛的一种数据结构类型.它通常包含三个私有成分,即指向数据数组的头指针.当前表长以及表的实际容量.表的头指针通常指向数据数组的基地址,通过数组的形式进行访问数据数组 ...

  4. Python数据结构之二——tuple(元组)

    Python版本:3.6.2  操作系统:Windows  作者:SmallWZQ 列表和元组是Python中最常见的内建序列.元组与列表一样,但是tuple一旦创建就不能修改.创建元组的语法非常简单 ...

  5. 通过四个例子理解JavaScript拓展运算符

    原文地址:JavaScript & The spread operator 拓展运算符看起来像什么? 三个点,... 它能做什么? 拓展运算符允许一个表达式在某个地方展开成为多个元素.变量或参 ...

  6. 【Tools】Pycharm 2018专业版 linux安装教程 附2018专业版密钥

    Linux安装pycharm2018专业版 1. 下载安装包 Pycharm下载地址:http://www.jetbrains.com/pycharm/download/ 2.终端打开你的安装包所在路 ...

  7. 本地创建yum源并安装lnmp

    注意:安装系统时,文件类型要未xfs类型,root要分配最多的空间 1.挂载安装光盘mount -t iso9660 -o loop CentOS-7-x86_64-DVD-1511.iso /mnt ...

  8. 从此不再担心键盘遮住输入框OC(

    从此不再担心键盘遮住输入框OC(二) 字数544 阅读1492 评论15 喜欢25 在我发布这篇文章没多久之前,我发布了一篇叫 从此不再担心键盘遮住输入框OC(一)的文章.我在那篇文章中介绍了我的键盘 ...

  9. 阿里云CentOS使用iptables禁止某IP访问

    在CentOS下封停IP,有封杀网段和封杀单个IP两种形式.一般来说,现在的攻击者不会使用一个网段的IP来攻击(太招摇了),IP一般都是散列的.于是下面就详细说明一下封杀单个IP的命令,和解封单个IP ...

  10. css去除ios文本框默认圆角

    css去除ios文本框默认圆角 input, textarea {-webkit-appearance: none;}