3

我正面临着一个我不知道如何解释的问题。我正在使用 Android 和 Google App Engine 做一个项目。当我尝试直接从 servlet(硬编码)将信息保存在 Google App Engine 的大表中时 - 保存没有问题。但是当我尝试从我的 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

我已经看到 405 HTTP 错误出现在 POST 方法的上下文中(“405 错误通常与 POST 方法一起出现。您可能试图在网站上引入某种输入表单,但并非所有 ISP 都允许 POST 方法处理表单所必需的。”) => 实际上,我正在尝试使用 POST 方法在数据库中执行添加(对象是 JPA 实体)。我从我的 Android 设备接收到的数据是通过输入流进行序列化的(在我的情况下,不能使用 JSON,这些是规范)。

此外,306 HTTP 错误是指切换代理。虽然这个错误可能有点直观,但这个错误超出了我学生的知识范围。

我已按照本教程(http://trumpy.cs.elon.edu/joel/sigcse2011/)的说明进行操作,这确实是我需要的,但我真的无法弄清楚我做错了什么。我一步一步地再次接受了这个程序,但我没有看到缺陷。

任何帮助将不胜感激。如果我应该发布一些代码,我会很乐意这样做。

最美好的祝愿,麦田怪圈

后期编辑:

现在我得到 417 HTTP 错误期望失败。我已经看到我应该将某个参数设置为 false,但这种解决方法仅适用于 .NET。有没有人知道Java中以下内容的对应者是什么?我真的很困惑。

     <system.net>
      <settings>
       <servicePointManager expect100Continue="false" />
      </settings>
     </system.net>
4

2 回答 2

6

这不是一个答案,但是对于评论来说太长并且可能会有所帮助,所以这里......

首先,很难知道这里发生了什么,因为信息有限。尝试在客户端或服务器上发布更多日志记录。例如,转到服务器控制台并获取更多信息,或在客户端中添加调试。我首先尝试从调试/测试工具(如 hurl.it)进行 POST:http ://www.hurl.it/ (hurl 是一个不错的 Web 前端,用于名为 curl 的命令行 HTTP 客户端,请参阅 curl如果您想要更高级的窥视,它本身)。这样您就可以测试和探索并确保您的服务器端按照您对通用客户端的期望工作。然后构建其他客户端(如 Android)。

其次,“Apache-HttpClient/UNAVAILABLE”不是错误,它只是用户代理字符串——所以忽略那部分。(UNAVAILABLE 是版本通常所在的位置,但某些 impl 有时似乎无法访问该版本。)

第三, 405 响应代码是一个错误,这意味着在您尝试 POST 的服务器上不允许 POST。这可能是因为在所述服务器上根本不允许 POST,或者您违反了某些安全策略(例如同源)。

如果是 AppEngine,请先检查您正在使用的 APP 并确保它支持 POST(在 AppEngine 上查找有关如何进行 POST 的信息来解决,例如:google app engine: 405 method not allowed)。当您说您可以直接从“servlet”执行此操作时,您的意思是来自不同客户端的 POST 可以工作吗?(Servlet 是一种服务器端技术,所以这有点令人困惑。)如果是这样,请确保您的 Android 应用程序以相同的方式对同一主机执行客户端部分(多部分与 urlencoded 等)。

有关可能涉及的安全问题的更多信息,请参阅这篇文章:Google App Engine + jQuery Ajax = 405 Method Not Allowed

于 2013-06-10T13:52:57.930 回答
0

我遇到了同样的麻烦,就我而言,这是由于服务器端区域没有写权限而导致的错误。我正在关注一个 android 测试,以在文件上写入一个通过 POST 方法以异步方式传输的值。Apache 收到了 POST 请求,但由于对文件的安全权限,无法将数据写入文件。

于 2014-09-24T10:59:08.530 回答