在跟第三方做接口对接的时候,发现,我加密请求过去的数据,对方总是解密失败。
下面是我使用的请求封装:
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编码即可。
相关推荐
综上所述,解决HttpClient乱码问题涉及多个环节,包括正确设置字符编码、理解HTTP头信息、自定义HttpClient配置以及编写健壮的工具类。只有对HTTP通信的各个环节有深入理解,才能有效地处理这类问题,确保数据传输的...
在HttpClient中,这个库用于处理URL编码和解码,以及在HTTP请求头或参数中可能涉及到的其他编码问题。 3. `commons-collections-3.2.jar`: Apache Commons Collections提供了对Java集合框架的扩展和增强,包括集合...
下面我们将详细探讨如何在Java中使用HttpClient来实现这一目标。 首先,我们需要导入必要的Apache HttpClient库,通常包含以下依赖: ```xml <groupId>org.apache.httpcomponents <artifactId>httpclient ...
- 在处理响应时,注意编码问题,例如上述代码中的“UTF-8”。 - 如果在生产环境中使用,建议使用`CloseableHttpClient`代替`DefaultHttpClient`,以利用其更好的资源管理机制。 通过上述示例和解释,你应该能够理解...
本实例将深入探讨如何在Java中使用HttpClient进行网络通信。 首先,你需要在项目中引入HttpClient的相关依赖。如果是Maven项目,可以在pom.xml文件中添加以下依赖: ```xml <groupId>org.apache.httpcomponents ...
它是HttpClient库的核心部分,包含了HTTP连接管理器、请求和响应模型、传输编码等低级API,为HttpClient提供底层支持。 最后,`commons-logging.jar`是Apache Commons Logging库,它是一个日志抽象层。在HttpClient...
这里提到的压缩包包含了使用Java HttpClient所需的多个关键组件。 1. `apache-mime4j-0.6.jar`: 这个库提供了对MIME消息解析的支持,MIME是一种标准,用于在邮件和网络消息中传输多媒体内容。在HTTP客户端中,它...
JavaEyeClient 封装了这些功能,可能包括预设的请求头设置、自动处理编码问题、更友好的异常处理机制等。 1. **HTTP 请求的基本操作**: - GET 请求:JavaEyeClient 可能提供了一个简单的接口来发送 GET 请求,...
Java HttpClient是Apache软件基金会的Apache HTTP Components项目中的一个核心组件,它提供了一个强大的、高度可定制的客户端HTTP通信API。这个工具广泛应用于Java开发者中,用于执行HTTP请求,获取响应,处理各种...
### JAVA调用HTTP及httpclient的详细说明 #### 一、引言 在现代软件开发中,客户端和服务端之间的通信通常通过HTTP协议实现。而在Java编程语言中,开发者可以选择多种方式来实现HTTP请求的发送与接收,其中`...
在实际使用中,由于网络传输和编码转换的问题,可能会遇到乱码问题。本篇将详细介绍如何使用HttpClient解决乱码问题。 一、HttpClient基本使用 HttpClient主要由以下几个核心组件构成: 1. HttpClient:客户端实例...
HttpClient Post提交多文件及多个普通参数,已经封装成工具类。 需传入 要请求的url 普通参数map 例 map.put("param1","张三"); 需要传入的文件流map 其中key为文件名 服务端接收无乱码。
总结来说,这个Java HttpClient 400错误的问题提醒我们: 1. 在使用FeignClient时,要确保环境一致性,并充分测试跨环境的兼容性。 2. 当遇到HTTP 400错误,要检查请求的结构,包括URL、Header和Body,特别是自定义...
4. **实体处理**:HttpClient支持对请求和响应中的实体进行编码和解码,如表单数据、JSON、XML等。EntityUtils类提供了读取和解析响应实体内容的方法。 5. **重试和恢复策略**:HttpClient可以通过设置RetryHandler...
在Java开发中,HttpClient是一个常用的工具,尤其在处理Web服务或者API调用时。它支持同步和异步操作,可以处理复杂的HTTP协议细节,使开发者能够更专注于业务逻辑而不是网络通信的底层实现。HttpClient库不仅包含了...
HttpClient中文乱码问题的核心在于字符编码不一致或者未明确指定。默认情况下,HttpClient可能使用ISO-8859-1作为编码,而我们的中文字符通常需要UTF-8编码才能正确显示。以下是一些解决HttpClient中文乱码问题的...
《Apache HttpClient 3.1详解及其在Java中的应用》 Apache HttpClient是一个强大的HTTP客户端实现库,主要用于构建Java应用程序,以实现对HTTP协议的全面、灵活且高效的处理。在这个专题中,我们将深入探讨Apache ...
服务器端自己写,本示例为客户端代码,可以解决httpClient4乱码问题,是替代修改源码的最佳写法。
### HttpClient学习精髓 #### 一、简介 HttpClient是Apache Jakarta Common下的一个子项目,它为开发者提供了高效、最新的以及功能丰富的支持HTTP协议的客户端编程工具包。HttpClient支持HTTP协议的最新版本及相关...
Java 使用 HttpClient 发送 POST 请求是网络编程中常见的任务,尤其在与 Web 服务进行交互时。Apache HttpClient 是一个强大的库,允许 Java 开发者轻松地执行 HTTP 请求。在这个示例中,我们将深入探讨如何使用 ...