作为代码的演示,我试图在我的 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
我做错了什么?
您正在向(显然)使用 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 设置中。
它的内部服务器错误..检查服务器端是否抛出任何异常。
这与你的android代码无关,问题出在服务器上。
您可以使用
AsyncTask
运行网络/文件系统相关操作。