【问题标题】:Android HttpPost request exceptionAndroid HttpPost 请求异常
【发布时间】:2013-09-02 05:03:29
【问题描述】:

作为演示代码的工作原理,我试图在我的 oncreate 函数中获取一些 JSON 数据。我知道它应该在不同的线程上运行,但我想确保代码在将它移动到它自己的线程之前成功获取我的 JSON。

代码如下:

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        /***************************************************/
        final String TAG = "PostFetcher";
        final String SERVER_URL = "http://kylewbanks.com/rest/posts";
//        final String TAG = "PostsActivity";
//        List<Post> posts;

        try {
            //Create an HTTP client
            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost(SERVER_URL);

            //Perform the request and check the status code
            HttpResponse response = client.execute(post);
            StatusLine statusLine = response.getStatusLine();

            if(statusLine.getStatusCode() == 200) {
                HttpEntity entity = response.getEntity();
                InputStream content = entity.getContent();

                try {
                    //Read the server response and attempt to parse it as JSON
                    Reader reader = new InputStreamReader(content);

                    GsonBuilder gsonBuilder = new GsonBuilder();
                    gsonBuilder.setDateFormat("M/d/yy hh:mm a");
                    Gson gson = gsonBuilder.create();
                    List<JsonObject> posts = new ArrayList<JsonObject>();

                    Log.e(TAG, "Checking: " + posts);

//                    posts = Arrays.asList(gson.fromJson(reader, JsonObject[].class));
                    content.close();

                } catch (Exception ex) {
                    Log.e(TAG, "Failed to parse JSON due to: " + ex);
                }
            } else {
                Log.e(TAG, "Server responded with status code: " + statusLine.getStatusCode());
            }
        } catch(Exception ex) {
            Log.e(TAG, "Failed to send HTTP POST request due to: " + ex);
        }
}

当我运行代码时,我收到倒数第二个异常消息:

Server responded with status code: 500

谁能告诉我我做错了什么?

【问题讨论】:

  • 错误代码 500 是内部服务器错误...服务器崩溃..
  • 出于好奇。为什么使用HttpPost?这是过去 10 天内第 4 次或第 5 次我看到人们使用 HttpPost 通过一种或另一种 RESTful API 从服务器读取 JSON
  • @Tseng:我是 Android 和 Java 编码的新手,我从教程中获得了代码。我只是稍微修改了一下
  • 您的问题仍然存在吗?如果没有一个答案能解决您的问题,您可能需要提供更多信息

标签: android json request http-post


【解决方案1】:

您正在向(显然)使用 RESTful 样式 API 的网站发送 HttpPost 请求。

这意味着,它适用于 HTTP 动词(GET、POST、PUT、DELETE)。

如果您想读取数据并且读取访问永远不会更改数据,请使用 GET。

如果您想更新或替换数据,请使用 PUT 或 POST(通常放置替换,POST 更改/添加)。然而,JavaScript 确实(或曾经)只支持 GET 和 POST 请求,所以请记住这一点。

如果要删除资源或集合,请使用 DELETE。

话虽如此:如果您想加载数据,请在您的情况下使用 Get HttpGet 而不是 HttpPost。

还可以阅读有关RESTful web APIs 的更多信息。

编辑: 事实上,在Fiddler2 中调用给定的 URL(如另一个答案的评论中所述)会导致 HTML 网站报告错误:

您通过 POST 调用了此 URL,但该 URL 不以斜杠结尾,并且 您设置了 APPEND_SLASH。 Django 无法重定向到斜杠 URL 同时维护 POST 数据。将表单更改为指向 kylewbanks.com/rest/posts/(注意尾部斜杠),或设置 APPEND_SLASH=False 在你的 Django 设置中。

【讨论】:

  • 谢谢。只是想知道你是否能告诉我为什么尾随斜杠?斜线有什么意义?
  • 这是来自 Django 的一些命名或 url 约定。引用的文本是通过 Http Post 请求调用 http://kylewbanks.com/rest/posts 时从网络服务器返回的错误消息(您不能从浏览器执行此操作,您需要像 Fiddler 这样的工具来发送 post 请求)
  • 我之前进一步回答的原因。 RESTful API 中的 GET 请求用于读取数据,因此像 http://kylewbanks.com/rest/posts 这样的 url 将读取所有帖子。当通过 POST 或 PUT 调用它时,这意味着您想对帖子做一些事情(即删除所有或多个帖子,将它们替换为另一个资源集合等)。阅读 Wiki 链接以更好地了解 RESTful API
  • 再次感谢。非常感谢
【解决方案2】:

它的内部服务器错误..检查服务器端是否抛出任何异常。

和你的android代码无关,问题出在服务器上。

您可以使用AsyncTask 来运行网络/文件系统相关的操作。

【讨论】:

  • 不是这样的。在浏览器中复制和粘贴时,该 URL 可以正常工作。但是如果你使用 Fiddler2 伪造一个 POST 请求,你会得到 500 错误。因为在 RESTful API 中,您无法通过 POST 请求读取数据,只能写入。而且由于他没有发送任何参数来更新数据,因此导致错误
猜你喜欢
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多