使用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 paramsMap) throws Exception {
        YxCommonRes yxRetCommonRes = new YxCommonRes();
        
        
        CloseableHttpClient httpclient = HttpClients.createDefault();
        HttpPost httppost = new HttpPost(url);
        CloseableHttpResponse response = null;
        final List values = new ArrayList();
        try {
            for (Map.Entry 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://请求发现也是通的,这就很奇怪。也希望有更加深度了解些的大佬给评论下是怎么回事。
哈哈,今天就要跑路回家了,也祝各位新年快乐!!年年涨工资(撒花)!!!!

你可能感兴趣的:(使用Httpclient发送post请求时,报出错误org.apache.http.client.ClientProtocolException)