`

java httpClient 编码问题

 
阅读更多

在跟第三方做接口对接的时候,发现,我加密请求过去的数据,对方总是解密失败。

下面是我使用的请求封装:

public static String sendHttpPost(String httpUrl, String params) {
	// 创建HttpPost
	HttpPost httpPost = new HttpPost(httpUrl);
	
	try {
		// 设置参数
		if (params != null && params.trim().length() > 0) {
			StringEntity stringEntity = new StringEntity(params, "UTF-8");  
			stringEntity.setContentType(CONTENT_TYPE_FORM_URL);
			
			httpPost.setEntity(stringEntity);
		}
		
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	return sendHttpPost(httpPost);
}

以上的请求方法,在请求不加密的数据时都是正常的,但是一旦加密就会导致对方解密失败。

而另一种请求封装却可以:

public static String sendHttpPostByFormEntity(String httpUrl, Map<String, String> paraMap) {
	// 创建HttpPost
	HttpPost httpPost = new HttpPost(httpUrl);
	
	try {
		// 设置参数
		List<NameValuePair> paramList = new ArrayList<NameValuePair>();
		
		for (Map.Entry<String, String> entry : paraMap.entrySet()) {
			paramList.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
		}
		
		httpPost.setEntity(new UrlEncodedFormEntity(paramList, "UTF-8"));
		
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	return sendHttpPost(httpPost);
}

很奇怪,明明两种方式,服务器端接收到的请求格式应该都是一样的。

 

于是,经过排查发现,因为使用的StringEntity的时候,contentType使用的是application/x-www-form-urlencoded编码类型,而UrlEncodedFormEntity使用的是类似URLEncoder的编码方式,而URLEncoder的实现是将字符串转换为application/x-www-form-urlencoded MIME格式,所以导致了最终编码上的差异。

最终,如果还是需要使用第一种StringEntity的方式,那么将params进行URL编码即可。

 

 

 

分享到:
评论

相关推荐

    Java后端HttpClient Post提交文件流 及服务端接收文件流

    HttpClient Post提交多文件及多个普通参数,已经封装成工具类。 需传入 要请求的url 普通参数map 例 map.put("param1","张三"); 需要传入的文件流map 其中key为文件名 服务端接收无乱码。

    .net core3.1 WebAPI使用HttpClient为企业微信上传临时素材

    asp.net core3.1 webAPI对接企业微信上传临时素材,返回media_id. 来自于实际项目;

    HttpClient以及获取页面内容应用

    * 解决中文乱码问题 * @param httpUrl * @return */ public static String downloadPage(String httpUrl) { StringBuffer pageBuffer = new StringBuffer(); URL pageUrl = null; try { pageUrl =...

    [享学Feign] 九、Feign + OkHttp和Feign + Apache HttpClient哪个更香?

    Redis作者说到:“灵活性被过分高估–&gt;约束才是解放”。...其实核心模块可以独立的work,但是不免它的能力偏弱,比如只能编码字符串类型、只能解码字符串类型,默认使用java.net.HttpURLConnection作为HC… 本篇将

    JAVA 人人网登陆实例代码(基于Apache httpclient 4.2.X)

    基于apache httpclient 4.2.X开发 自动处理redirect url jsoup解析response text log4j 自动生成日志 源代码基于UTF-8编码,如果出现乱码请切换到此编码 压缩包 包含所有jar文件。

    HttpClient PostMethod 上传文件

    本人自己总结的httpClient PostMethod 上传文件完整实例 以及 使用java PostMethod 和GetMethod 发送请求实例 及乱码处理

    JAVA上百实例源码以及开源项目

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    JAVA上百实例源码以及开源项目源代码

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    Jsoup+httpclient 模拟登陆和抓取

    //设置编码 post.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "GBK"); String content= post.getResponseBodyAsString(); FileUtil.write(content, filePath); System.out.println("\n...

    java开源包4

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包101

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包11

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包6

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包9

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包8

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java jdk实列宝典 光盘源代码

    Http客户端,httpClient.java; 基本socket编程,介绍socket编程的基本步骤,启动socket服务器后,在打开socket的客户端,在输入框里输入消息发送到服务器,服务器受到消息后返回给客户端; Http服务器,...

    java开源包10

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包5

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

    java开源包3

    WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的...

Global site tag (gtag.js) - Google Analytics