Android HttpPost请求异常

时间:2013-09-02 05:03:29

标签: android json request http-post

就像演示代码一样,我试图在我的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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

如果你想更新或替换数据,用户PUT或POST(通常要更换,POST要更改/添加)。但是,JavaScript确实(或确实)只支持GET和POST请求,因此请记住这一点。

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

话虽如此:如果您要加载数据,请在您的案例HttpGet而不是HttpPost中使用Get。

另请阅读有关RESTful web APIs的更多信息。

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

  

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

答案 1 :(得分:0)

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

它与您的Android代码无关,问题出在服务器上。

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