一 HttpClient简介
SpringCloud中服务和服务之间的调用全部是使用HttpClient,还有前面使用SolrJ中就封装了HttpClient,在调用SolrTemplate的saveBean方法时就调用HttpClient技术。
当前大部分项目暴漏出来的接口是Http请求,数据格式是JSON格式,但在一些老项目使用的仍然是webService。
HttpClient 提供的主要的功能
(1)实现了所有 HTTP 的方法(GET,POST,PUT,DELETE 等)
(2)支持自动转向
(3)支持 HTTPS 协议
(4)支持代理服务器等
二 需求
张文发表昨天,我的老大说,客户有一台设备,关于人脸采集的项目,需要我去测试一个端口,并且需要使用java组装form-data,进行人脸注册。对方提供给我们一个http协议请求端口,那么问题就来:
java实现Http请求是否跟Ajax这种请求方式一样呢
java实现请求的数据格式改如何封装成form-data数据格式呢
java在组装请求的时候,你对端口校验一无所知的情况下改如何测试呢
请求格式改如何确定呢
三 实现HttpClient最原始请求方式
public static String executePost(String url, String body, CloseableHttpClient httpClient) { HttpPost httpPost = new HttpPost(url); httpPost.addHeader(HTTP.CONTENT_TYPE, "multipart/form-data; boundary=----WebKitFormBoundary3VTXtMlwiiJr30da");//请求参数为JSON格式 StringEntity entity = new StringEntity(body, "UTF-8"); httpPost.setEntity(entity); HttpResponse resp = null; String text = ""; try { resp = httpClient.execute(httpPost); HttpEntity respEntity = resp.getEntity(); text = EntityUtils.toString(respEntity, "UTF-8"); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } return text; }
需要配置、数据格式、body封装
浏览器中检索网页有个Network,请看一下我们需要的Conten-type等相关内容
数据请求端口,你可以ping一下是否通畅
form-data也是有body传输的,只是表特殊
封装body,我们可以看一下form-data与json数据传送的区别
这里准备的阶段,就不一一介绍了,可以自己研究,毕竟每个人都有一个学习的过程,举一反三才是进步的最终方式。
三 模拟数据请求
String url = "http://xxx.xxx.x.xxx:2020/faceai/faceSet"; String res =new HttpClientUtils().executePost(url,body, HttpClientBuilder.create().build()); System.out.println(res);
这里就不展示请求过程,但是给你们看一下返回数据
{"code":0,"msg":"have no image"}
想必已经明白请求是请求上了,说明端口是没问题了,这里会问我发送的数据不知道是什么,我想说的,不要再我发送了什么,我提供一套解决问题的思路。
- 端口没问题了,可以请求,只是我们传输的数据有问题,具体什么问题还要分析
问题分析需要的工具
- Wireshark请求抓包软件
- Compare It 比对软件
这两款软件基本都程序员必备的软件,第一个是前端和后端中第三方平台,第二个是对比软件,现在Git,SVN都有比对的功能,但是我们需要比对的是数据,不是代码,所以还是需要它的。
先说说抓包软件,这是一款免费的软件,前后端扯皮,一个说请求,一个说没请求,一个说我给参数,一个说我没收到参数。第一反应就是看日志,但是日志只记录后端是否请求或者参数,当你看到的确没收到,也不不一定前端就真的没发送请求。那么我们就用这个来抓包,你到底有没有发送,还是你到底有没有接收就一目了然,数据包是不可能丢的,除非你断网了。 下面是模拟请求抓包过程:
我请求一次百度
这就是抓包,对于百度来说,这种负载均衡技术对他们来说就是毛毛雨,IP地址很多,域名不过是IP地址的解析,域名负载过后绑定的IP太多了,百度一天被ping个70亿次,如果仅仅是一个服务端,一个IP,百度早就炸了。
这就是抓包的过程。
五 form-data数据组装三个要素
java封装body,要让它的后端可接收,可解析
Content-type
public static String GetString(String faceArr_val) { String BOUNDARY = "----WebKitFormBoundary3VTXtMlwiiJr30da"; // 分隔符 StringBuffer sb = new StringBuffer(); // 发送每个字段: sb = sb.append("--"); sb = sb.append(BOUNDARY); sb = sb.append("\r\n"); sb = sb.append("Content-Disposition: form-data; name=\"" + "faceArr" + "\"\r\n\r\n"); sb = sb.append(faceArr_val); sb = sb.append("\r\n"); sb = sb.append("--"); sb = sb.append(BOUNDARY); sb = sb.append("\r\n"); sb = sb.append("Content-Disposition: form-data; name=\"" + "kind" + "\"\r\n\r\n"); sb = sb.append(2 + ""); sb = sb.append("\r\n"); sb = sb.append("--"); sb = sb.append(BOUNDARY); sb = sb.append("\r\n"); sb = sb.append("Content-Disposition: form-data; name=\"" + "IsSetStranger" + "\"\r\n\r\n"); sb = sb.append(2 + ""); sb = sb.append("\r\n"); sb = sb.append("--"); sb = sb.append(BOUNDARY); sb = sb.append("--"); return sb.toString(); }
Content-type:
httpPost.addHeader(HTTP.CONTENT_TYPE, "multipart/form-data; boundary=----WebKitFormBoundary3VTXtMlwiiJr30da");//请求参数为JSON格式
注意boundary是不固定的,你可以模拟一次请求,尝试一下,然后复制粘贴 # 六 数据格式 - key-value - json字符串 - get请求:& # 七 请求尝试-POST {"code":0,"msg":"success"} # 八 具体问题具体分析 for循环,把它的数据库塞到炸裂记得更换IP代理,有的系统是可以防御的