java,NC二开,HTTP第三方请求踩坑

本文介绍了使用httpClient和commons-httpclient进行HTTP POST请求时遇到的问题及解决方案,特别是当请求体包含中文字段时如何正确设置编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做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;
    }

总结

其实方式都大同小异,设置各种头和体的方法,设置编码以及注意参数的数据格式,如果一种不行就换一种(前提是请求方式以外的时候)如果不是包的问题,那么肯定是自己的参数设置等没有设置好,那么就逐一解决比较好,在哪一步报错就直接进去包方法里去看方法,有很多重载的方法,只是传的参数不一样,然后就可以排查错误啦

我的问题就是因为请求体中字段是中文的,所以要指定编码格式,所以报错了,因为上一次做的时候是英文的,正常请求,这里也算是自己粗心大意,记录一下~ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值