试图弄清楚这个问题有多长时间了。我正在使用HttpClient.execute发送一个帖子请求,并将json正文发送到我的服务器api。在正常的wifi和大多数3g下工作正常,但特别是在带有AT& T数据盘的手机上,它在3g上,当我尝试执行请求时,我收到了HttpResponseException状态代码422。关于422的研究,它说它是由于:
" 422 Unprocessable Entity(WebDAV)(RFC 4918),请求格式正确但由于语义错误而无法遵循。"
所以我猜测请求的结果出了问题,但我在形成请求时做了同样的事情,无论我是wifi还是3g。关于可能导致此错误的任何想法?
编辑: 看起来我的服务器正在捕获伪造保护的帖子。把它关掉,错误停止了,但api没有通过。挖得更深一些并打印出服务器实际收到的内容,做了wifi开关之间的比较,注意到两个不同之处。首先,身体在3g上是空的,似乎它以某种方式被阻止被发送。其次,标题改变了发送的内容类型:
wifi:" HTTP_CONTENT_TYPE" =>" application / json" att 3g:" HTTP_CONTENT_TYPE" =>" text / plain;字符集= ISO-8859-1,应用/ JSON"
我期待" application / json"鉴于我设置了这样的连接:
StringEntity se = new StringEntity(json.toString());
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
当我移动到3g时,为什么事情会发生变化?
更新:跑出一个tcpdump,看起来我从android发送的内容与wifi和3g完全相同,所以它似乎是提供商改变了我的数据。除HTTPS以外的任何其他建议策略?
答案 0 :(得分:7)
解决!
旧代码:
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上运行。不确定为什么在使用StringEntity时,wifi和3g之间的tcpdump看起来完全相同,但似乎已经修复了问题,所以我没有抱怨。