一 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代理,有的系统是可以防御的