在 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的主要内容,如果未能解决你的问题,请参考以下文章
在模块 jetified-okhttp-3.12.0 和 jetified-okhttp-ws-3.4.1 中发现重复的类 okhttp3.internal.ws.RealWebSocket