OkHttp post请求编码问题

本文详细介绍了在使用OkHttp进行HTTP请求时,遇到服务器编码与客户端编码不一致导致数据乱码的问题,并提供了两种解决方案:一种是在回调方法中将返回的数据解析为GB2312编码;另一种是自定义POST请求参数的编码方式,确保编码一致性。

给同事做一个小程序,模拟网页的post请求。

遇到问题,服务器是gb2312的编码,而okhttp默认返回和发送都换转成utf8的编码,造成数据返回变成了。。。乱码。。。

那么解决思路就是将编码转化为gb2312。

那么解决思路有了,那么怎么转换呢。。
找了些资料。
首先是将返回的数据解析成gb2312

在回调方法onResponse方法中

byte[] b = response.body().bytes();     //获取数据的bytes
String info = new String(b, "GB2312");   //然后将其转为gb2312

然后是post请求
默认使用FormEncodingBuilder可以构建键值队的post请求,但是它没办法更改参数的编码,如果需要更改就需要改源代码,没必要那么麻烦吧。

那么就使用RequestBody.create();
自己设置一系列的参数
RequestBody.create(MediaType.parse(“application/x-www-form-urlencoded;charset=gb2312”)

设置post类型是application/x-www-form-urlencoded
charset是gb2312
那么开始构建键值队
其实就是一个字符串
key1=value1&key2=value2
然后放到第二个参数里就行了

Request request = new Request.Builder().url(url)
.post(RequestBody.create(MediaType.parse("application/x-www-form-urlencoded;charset=gb2312"),内容))
.build();
### 如何使用 Java 的 OkHttp 库发送 POST 请求 以下是通过 OkHttp 发送 POST 请求的一个完整示例: ```java import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class OkHttpPostExample { public static void main(String[] args) throws Exception { OkHttpClient client = new OkHttpClient(); MediaType mediaType = MediaType.get("application/json; charset=utf-8"); String jsonBody = "{\"key\":\"value\"}"; // JSON 数据作为请求体 RequestBody body = RequestBody.create(jsonBody, mediaType); Request request = new Request.Builder() .url("https://example.com/api") // 替换为目标 URL .post(body) .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); System.out.println(response.body().string()); } } } ``` 上述代码展示了如何构建并执行一个 POST 请求。具体说明如下: - 首先创建了一个 `OkHttpClient` 实例用于发起网络请求[^1]。 - 定义了 `MediaType` 来指定请求的内容类型为 JSON 格式,并设置了字符编码UTF-8[^2]。 - 构造了一个字符串形式的 JSON 数据作为请求体内容,并将其传递给 `RequestBody.create()` 方法来生成请求体对象[^3]。 - 使用 `Request.Builder` 创建了一个新的 HTTP 请求实例,指定了目标 URL 和方法类型(这里是 `.post()`),并将之前准备好的请求体附加到该请求上。 #### 关键点解析 当处理响应时需要注意的是,在 Kotlin 或者其他支持 null-safety 的语言里可以采用更安全的方式去访问可能为空的对象属性;而在纯 Java 环境下,则需自行判断是否成功以及手动捕获异常情况下的错误信息。 此外,如果要上传文件或者表单数据而非简单的 JSON 字符串,还需要调整相应的媒体类型及构造方式。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值