StringEntity格式编码问题

本文解析了使用Apache HTTPClient发起POST请求时,因StringEntity编码格式引发的后端解码错误问题。强调了初始化StringEntity时指定编码的重要性,避免了ISO_5598_1默认编码引起的异常。

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

    最近使用Apache的httpclient发起httpPost请求,后端一直提示编码格式错误。代码和环境都是在UTF-8写处理的,后端接受的编码也是UTF-8,但是后端依然报错。在跟踪代码的时候,发现主要是客户端StringEntity的处理问题。StringEntity设置编码格式主要有以下两种方式
//第一种方式:后端无法解码
StringEntity stringEntity = new StringEntity(JSONObject.toJSONString(params));
stringEntity.setContentType("UTF-8");

//第二种方式:请求成功
StringEntity stringEntity = new StringEntity(JSONObject.toJSONString(params), "UTF-8");
 在跟踪源码的时候,发现StringEntity的处理逻辑如下:
public StringEntity(String string) throws UnsupportedEncodingException {
        this(string, ContentType.DEFAULT_TEXT);
}

public StringEntity(String string, ContentType contentType) throws UnsupportedCharsetException {
        Args.notNull(string, "Source string");
        Charset charset = contentType != null ? contentType.getCharset() : null;
        if (charset == null) {
            charset = HTTP.DEF_CONTENT_CHARSET;
        }

        this.content = string.getBytes(charset);
        if (contentType != null) {
            this.setContentType(contentType.toString());
        }

 }

   当不传入ContentType时,会使用默认值,而该处的默认编码格式是:ISO_5598_1。所以后端才会提示异常。

    总结:使用httpclient时,尽量使用第二种方式来初始化StringEntity,避免因为编码格式导致异常。

### 如何在 `HttpEntity` 中设置 UTF-8 编码 在 Java 的 HTTP 客户端开发中,为了确保传输的数据能够正确解析并支持多种字符集(如 UTF-8),通常需要显式地指定编码方式。以下是通过 `StringEntity` 设置 UTF-8 编码的一个典型方法。 #### 使用 `StringEntity` 设置 UTF-8 编码 当发送 POST 请求时,可以使用 `org.apache.http.entity.StringEntity` 类来创建请求体,并将其附加到 `HttpPost` 对象上。下面是一个完整的示例代码: ```java import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.entity.StringEntity; import org.apache.http.util.EntityUtils; public class HttpClientExample { public static void main(String[] args) throws Exception { CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("https://example.com/api"); // 创建 JSON 数据作为请求体 String jsonBody = "{\"name\":\"Jöhn\", \"country\":\"Sverige\"}"; // 将数据封装为 StringEntity 并设置 UTF-8 编码 StringEntity entity = new StringEntity(jsonBody, "UTF-8"); entity.setContentType("application/json"); // 设置 Content-Type 头部 // 添加实体到请求对象 httpPost.setEntity(entity); try (CloseableHttpResponse response = httpClient.execute(httpPost)) { int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == 200) { String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println("Response Body: " + responseBody); } else { System.err.println("Failed with status code: " + statusCode); } } } } ``` 以上代码展示了如何通过 `StringEntity` 构造器传递第二个参数 `"UTF-8"` 来设置编码[^3]。此外,在实际应用中还需要注意服务器返回的内容也需要以相同的编码方式进行处理。 #### 关键点说明 1. **设置 Content-Type**: 在构建 `StringEntity` 后,调用其 `setContentType()` 方法指定了 MIME 类型为 `application/json`,这有助于接收方识别传入的是 JSON 格式的字符串。 2. **读取响应内容时也需指定编码**: 当获取服务器响应时,同样应使用 `"UTF-8"` 参数调用 `EntityUtils.toString(HttpEntity)` 函数解码响应内容[^3]。 3. **HTTP 响应头中的 charset 配置**: 如果服务端未明确声明使用的字符集,则客户端可能无法正确解释非 ASCII 字符串。因此建议开发者在实现 RESTful API 或其他 Web 接口时始终定义清晰的 `Content-Type` 和对应的 `charset` 属性[^2]。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值