java httpClient 编码问题
程序员文章站
2022-06-11 09:59:39
...
在跟第三方做接口对接的时候,发现,我加密请求过去的数据,对方总是解密失败。
下面是我使用的请求封装:
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编码即可。
上一篇: 基于php权限分配的实现代码
推荐阅读
-
Python2.x版本中基本的中文编码问题解决
-
记一次使用JAVA上转型对象出现的问题
-
mysql/Java服务端对emoji的支持与问题解决方法详解
-
关于txt文件导入数据库编码的有关问题
-
Java 环境部署之Idea :解决Idea 中gradle编译 war 包编码不对
-
java - PHP curl模拟POST问题,为什么明明是模拟的是POST,firebug仍显示GET?
-
【SpringBoot】解决Java下载文件时文件名中的中文变成下划线的问题
-
Web 开发中遇到的UTF-8编码的问题总结第1/2页
-
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总_PHP
-
01 java 基础:jdk jre path classpath 相关问题