使用Httpclient发送post请求时,报出错误org.apache.http.client.ClientProtocolException

最近项目新接一家供应商,接口上的对接,使用CloseableHttpClient的工具类如下:

public class YxApiUtil {
    private static final Log log = LogFactory.getLog(YxApiUtil.class);
    
    public static YxCommonRes doPost(String url,TreeMap<String, String> paramsMap) throws Exception {
        YxCommonRes yxRetCommonRes = new YxCommonRes();
        
        
        CloseableHttpClient httpclient = HttpClients.createDefault();
        HttpPost httppost = new HttpPost(url);
        CloseableHttpResponse response = null;
        final List<NameValuePair> values = new ArrayList<NameValuePair>();
        try {
            for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
                values.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
            }
    
            httppost.setEntity(new UrlEncodedFormEntity(values, HTTP.UTF_8));  //进行转码
            //httppost.addHeader("ContentType", "application/x-www-form-urlencoded;charset=UTF-8");
            log.info("doPostNew()-->param:"+values);
            log.info("doPostNew()-->call url <"+ url +"> start");
            response = httpclient.execute(httppost);
            
            int code = response.getStatusLine().getStatusCode();
            log.info("doPostNew()-->http resposeCode is:" + code);
            
            if (HttpURLConnection.HTTP_OK == code) {
                String resEntity = EntityUtils.toString(response.getEntity(), "UTF-8");
                log.info("doPostNew()-->resEntity is:" + resEntity);
                JSONObject jSonObject_first = JSON.parseObject(resEntity);
                yxRetCommonRes = JSONObject.toJavaObject(jSonObject_first, YxCommonRes.class);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }  finally {
            response.close();
            log.info("doPostNew()-->end");
        }
        return yxRetCommonRes;
    }
}

由于供应商有区分测试环境和正式线网环境,前期代码也都通过了测试环境的测试,前天正式上线之后,请求就一直不通,而且报出下面错误:

org.apache.http.client.ClientProtocolException
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
....
  • 因为供应商那边有配置请求的IP白名单,找了供应商对接人发现IP是配的我们线上机器的。排除....
  • 然后觉得可能是我们这边请求机器网络有问题,所以找了运维的同事在线网机器通过命令行请求,结果是通的。

这时候就很奇怪了。并不是网络层面的问题,但是代码方面测试环境有没有问题呀。然后同事就让我去检查下线网数据库中是不是请求的地址填错了或者填的地址里面有空格什么的。然后我去翻了一遍邮件找到了对方给的请求地址:xxxxx.xxx.xxx.com/xxxxx/api.json格式就是这样,然后跟着线网数据库中配置的地址一个个的对照,都是一样的,也不存在什么空格。后面就各种百度,发现也都与我遇到的不太匹配。

然后一上午没有解决,就很蓝瘦,很困惑。抱着无助的困惑我又各种检查,然后在看线网的数据库时就发现,唉!别的请求地址好像前面都有加 http:// 协议头 ,再看看这个没有,当时我就觉得肯定是这个问题了,然后在请求地址前上加上了协议头,然后,事就这样成了!
记下这次的坑,希望能够帮到以后遇到问题的同学们,但是我还真不知道加不加http协议头到底有什么区别,我也自己测试过,我本机两个项目一个项目写了一个接口,另外一个项目通过同样的方式请求,查了自己本机的IP地址,然后请求路径就没有加http://请求发现也是通的,这就很奇怪。也希望有更加深度了解些的大佬给评论下是怎么回事。
哈哈,今天就要跑路回家了,也祝各位新年快乐!!年年涨工资(撒花)!!!!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,928评论 25 709
  • 名词延伸 通俗的说,域名就相当于一个家庭的门牌号码,别人通过这个号码可以很容易的找到你。如果把IP地址比作一间房子...
    杨大虾阅读 20,655评论 2 56
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,087评论 19 139
  • 人类只有一个可生息的村庄-地球。可是这个村庄正在被人类制造出来的各种环境灾难所威胁:水污染、空气污染、植被萎缩...
    博硕妈阅读 259评论 0 0
  • -01- 三更半夜的,朋友给我发了几张聊天记录,问,二瑾,你看,他这是要追我吗? 我点开一看,那男生对朋友说的原话...
    苏二瑾阅读 693评论 2 3