gpt4 book ai didi

Android:HttpPost 内容类型 header 和正文在 wifi 和 3g 之间不同

转载 作者:太空狗 更新时间:2023-10-29 16:07:19 25 4
gpt4 key购买 nike

一段时间以来,我一直在努力弄清楚这个问题出了什么问题。我正在使用带有 json 正文的 HttpClient.execute 向我的服务器 api 发出发布请求。在普通 wifi 和大多数 3g 下工作正常,但特别是在具有 AT&T 数据计划的手机上,它在 3g 上,当我尝试执行请求时,我得到一个 HttpResponseException,状态代码 422。对 422 做了一些研究,它说它到期了到:

“422 无法处理的实体 (WebDAV) (RFC 4918),请求格式正确但由于语义错误无法遵循。”

所以我猜测请求发出的方式出了问题,但我在形成请求时做同样的事情,无论我是使用 wifi 还是 3g。关于可能导致此错误的原因有什么想法吗?

编辑:看起来我的服务器正在捕捉带有伪造保护的帖子。将其关闭,错误停止,但 api 没有通过。挖得更深一点,打印出服务器实际接收到的内容,比较了 wifi 的开启和关闭,发现了两个不同之处。首先,正文在 3g 上是空的,似乎以某种方式被阻止发送。其次, header 更改了发送的内容类型:

wifi: "HTTP_CONTENT_TYPE"=>"application/json"att 3g: "HTTP_CONTENT_TYPE"=>"text/plain; charset=ISO-8859-1,application/json"

鉴于我正在这样设置我的连接,我期待“application/json”:

StringEntity se = new StringEntity(json.toString());
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));

知道为什么当我转向 3g 时情况会发生变化吗?

更新:运行 tcpdump,看起来我从 android 发送的内容在 wifi 和 3g 之间完全相同,所以似乎是提供商对我的数据进行了更改。除了 HTTPS 之外,还有其他建议的策略吗?

最佳答案

解决了!

旧代码:

    mPost = new HttpPost(ur);
StringEntity se = new StringEntity(json.toString());
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
mPost.setEntity(se);

新代码:

    mPost = new HttpPost(ur);
ByteArrayEntity baEntity = new ByteArrayEntity(json.toString().getBytes("UTF8"));
baEntity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
mPost.setEntity(baEntity);

非常像使用 ByteArrayEntity 而不是 StringEntity,因为我的帖子正文使其在 3g 上运行。不确定为什么会这样 wifi 和 3g 之间的 tcpdump 在使用 StringEntity 时看起来完全一样,但它似乎已经解决了问题,所以我没有提示。

关于Android:HttpPost 内容类型 header 和正文在 wifi 和 3g 之间不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11146655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com