在 OkHttp 中等效的 setEntity - Android

Posted

技术标签:

【中文标题】在 OkHttp 中等效的 setEntity - Android【英文标题】:setEntity equivalent in OkHttp - Android 【发布时间】:2019-09-10 07:56:19 【问题描述】:

我正在从 Apache HTTP 旧版客户端迁移到 OkHttp,但在查找两者之间的等价关系时遇到了一些问题。几天前,我询问了有关同一主题的凭据,现在我又陷入了困境:

在旧的实现中我有这个:

TimeStampRequestGenerator reqGen = new TimeStampRequestGenerator();
reqGen.setCertReq(true);

MessageDigest digest = MessageDigest.getInstance("SHA256");
digest.update(myData);

TimeStampRequest request = reqGen.generate(TSPAlgorithms.SHA256, digest.digest(), BigInteger.valueOf(100));

byte[] enc_req = request.getEncoded();

myHttpPost.setEntity(new ByteArrayEntity(enc_req));

最相关的行是最后一行(因为其他行只是构建请求,幸运的是,我不需要更改它们),它将实体添加到 HttpPost。

检查this answer似乎请求的实体是

HTTP 请求或响应的大部分内容,包括一些标头和正文(如果存在)。似乎是没有请求或状态行的整个请求或响应

但是这个定义让我感到困惑,因为我在 OkHttp 中找不到与“标题和正文”的等价物。我试过的:

MediaType textPlain = MediaType.parse("text/plain; charset=utf-8");
RequestBody requestBody = RequestBody.create(textPlain, request.getEncoded().toString());
Request myNewRequest = (new Request.Builder()).url(urlString).post(requestBody).build();

但它不起作用(我从服务器获得 500)。有谁知道正确的等价物吗?

【问题讨论】:

【参考方案1】:

我终于找到了答案:我可以像以前一样使用TimeStampRequest编码,无需任何修改。正如我认为的那样,更改仅适用于 setEntity。

这是使用 OkHttp 的请求:

MediaType textPlain = MediaType.parse("binary");
RequestBody requestBody = RequestBody.create(textPlain, request.getEncoded());
Request myNewRequest = (new Request.Builder()).url(urlString).post(requestBody).build;

正如您所看到的,与我尝试的先前代码的唯一变化是我使用 binary 作为 MediaType,这很有意义,因为我们正在发送一个字节数组(以前使用来自 Apache 客户端的 ByteArrayEntity) .

希望它对某人有所帮助。

【讨论】:

以上是关于在 OkHttp 中等效的 setEntity - Android的主要内容,如果未能解决你的问题,请参考以下文章

java积累---HttpDelete请求方式传递参数

在模块 jetified-okhttp-3.12.0 和 jetified-okhttp-ws-3.4.1 中发现重复的类 okhttp3.internal.ws.RealWebSocket

在 Okhttp 中处理身份验证

在 OkHTTP 中处理超时

Retrofit+Okhttp 在 Android 中是不是默认使用 httpCaching?

Android 在 OKHttp 中启用 TLSv1.2