我正在面对一个我不知道如何解释的问题。我正在使用Android和Google App Engine进行项目。当我试图直接从servlet(硬编码)保存Google App Engine的Big Table中的信息时 - 执行保存没有问题。但是当我尝试从我的Android设备保存数据时,不执行保存,日志指示Apache-HttpClient / UNAVAILABLE错误。更具体一点:
405 55ms 0kb Apache-HttpClient/UNAVAILABLE (java 1.4)
82.155.246.249 - - [10/Jun/2013:05:20:59 -0700] "POST /servletnamehere HTTP/1.1" 405 306 - "Apache-HttpClient/UNAVAILABLE (java 1.4)" "appnamehere.appspot.com" ms=56 cpu_ms=21 cpm_usd=0.000034 app_engine_release=1.8.0 instance=00c61b117cede3f754aa1ece730dc88287a20199
我已经看到在POST方法的上下文中出现405 HTTP错误(“POST方法经常出现405错误。您可能试图在网站上引入某种输入表单,但并非所有ISP都允许处理表单所需的POST方法。“)=>实际上,我正在尝试使用POST方法在数据库中执行add(对象是JPA实体)。我从Android设备收到的数据是通过输入流序列化的(在我的情况下,使用JSON不是一个选项,这些是规格)。
此外,306 HTTP错误引用切换代理。虽然毛孔误差可能有点直观,但这个超出了我的学生知识。
我已按照本教程(http://trumpy.cs.elon.edu/joel/sigcse2011/)的说明操作,这确实是我需要的,但我真的无法弄清楚我做错了什么。我再次采取了程序,一步一步,但我没有看到这个缺陷。
任何帮助都将受到赞赏。如果我发布一些代码,我很乐意这样做。
祝福, Cropcircles
LATER EDIT:
现在我得到417 HTTP错误预期失败。我已经看到我应该在false上设置某个参数,但是此解决方法仅适用于.NET。在Java中有没有人知道下面的代码是什么?我真的很困惑。
<system.net>
<settings>
<servicePointManager expect100Continue="false" />
</settings>
</system.net>
答案 0 :(得分:6)
这不是一个答案,但对于评论来说太长了,可能会有所帮助,所以这里有......
首先,由于信息有限,很难说出这里发生了什么。尝试在客户端或服务器上发布更多日志记录。例如,转到服务器控制台并获取更多信息,或在客户端中添加调试。我首先尝试从调试/测试工具(如hurl.it:http://www.hurl.it/进行POST(对于名为curl的命令行HTTP客户端,请输入一个很好的Web前端,如果需要,请参阅curl本身更先进的偷看)。通过这种方式,您可以进行测试和调整,确保您的服务器端能够像您期望的那样使用通用客户端。然后构建其他客户端(如Android)。
其次,“Apache-HttpClient / UNAVAILABLE”不是错误,它只是用户代理String - 所以忽略该部分。 (UNAVAILABLE是版本通常所在的位置,但似乎有些impls有时无法访问该版本。)
第三,405响应代码是一个错误,这意味着在您尝试POST的服务器上不允许POST。这可能是因为在所述服务器上根本不允许POST,或者您违反了某些安全策略(例如同一来源)。
如果是AppEngine,首先检查您正在使用的APP并确保它支持POST(查找有关如何在AppEngine上进行POST解决的信息,例如:google app engine: 405 method not allowed)。当你说你可以直接从“servlet”做到这一点时,你的意思是来自不同客户端的POST有效吗? (Servlet是一种服务器端技术,因此有点令人困惑。)如果是这样,那么请确保您的Android应用程序以相同的方式对同一主机执行客户端部分(multipart vs urlencoded等)。
关于可能涉及的安全性问题,请参阅以下文章:Google App Engine + jQuery Ajax = 405 Method Not Allowed。
答案 1 :(得分:0)
我遇到了同样的麻烦,在我的情况下,由于服务器端区域没有写入权限,这是一个错误。 我正在按照android测试在文件上写一个通过POST方法以异步方式传输的值。 Apache收到了POST请求,但由于其安全权限,无法在该文件上写入数据。