在做nc二开时需要调用第三方接口推送数据,用过两种方式httpClient和commons-httpclient引用这两个包都可以请求,但是最近用httpClient时发现包头会报错,引用不了这个包,一番查阅下来各种说法都有,大概就是包和已有其他包有冲突或者版本问题,也没有深入研究,所以就用了第二种commons-httpclient,但是比传统的httpClient限制多一点,加上我请求的参数字段名有中文,没错,就是中文字段,离大普,所以踩了很多坑,这里记录一下。
public JSONObject sendHttpPost(String url, Object body) throws Exception {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", "application/json;charset=UTF-8");//头设置,还可以设置其他param等参数
httpPost.setEntity(new StringEntity((String) body));//参数体设置
CloseableHttpResponse response = httpClient.execute(httpPost);
System.out.println(response.getStatusLine().getStatusCode() + "\n");
HttpEntity entity = response.getEntity();
String responseContent = EntityUtils.toString(entity, "UTF-8");//设置编码(尤其是有中文)
JSONObject jsonObject =JSONObject.parseObject(responseContent);
System.out.println(responseContent);
response.close();
httpClient.close();
return jsonObject;
}
这是第一种方式,下面时第二种
public static String doPost(String url, JSONObject json,String token){
HttpClient httpClient = new HttpClient();
PostMethod postMethod = new PostMethod(url);
//postMethod.addRequestHeader("accept", "*/*");
//postMethod.addRequestHeader("connection", "Keep-Alive");
//设置json格式传送
postMethod.addRequestHeader("Content-Type", "application/json;charset=UTF-8");
postMethod.addRequestHeader("Accept-Encoding", "gzip, deflate, br");
postMethod.addRequestHeader("token", token);
//设置下面这个Header
//postMethod.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
//添加请求参数
//postMethod.addParameter("param", json.getString("param"));
StringRequestEntity param;
try {
param = new StringRequestEntity(json.toJSONString(),"Content-Type","UTF-8");//设置编码
postMethod.setRequestEntity(param);
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
String res = "";
try {
int code = httpClient.executeMethod(postMethod);
if (code == 200){
byte[] responseBody = postMethod.getResponseBody();
res = new String(responseBody, "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
}
return res;
}
总结
其实方式都大同小异,设置各种头和体的方法,设置编码以及注意参数的数据格式,如果一种不行就换一种(前提是请求方式以外的时候)如果不是包的问题,那么肯定是自己的参数设置等没有设置好,那么就逐一解决比较好,在哪一步报错就直接进去包方法里去看方法,有很多重载的方法,只是传的参数不一样,然后就可以排查错误啦
我的问题就是因为请求体中字段是中文的,所以要指定编码格式,所以报错了,因为上一次做的时候是英文的,正常请求,这里也算是自己粗心大意,记录一下~