【发布时间】:2014-02-22 11:18:03
【问题描述】:
在使用 Volley 库时,我注意到在进行 POST JsonObjectRequest 时,如果服务器在响应 (response.data) 中返回没有数据的代码 304 或 200,Volley 会将其解释为错误响应,而不是成功了。
我设法通过在 JsonObjectRequest.java 类的方法 Response<JSONObject> parseNetworkResponse(NetworkResponse response) 中添加几行代码来解决它。
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
if (!response.notModified) {// Added for 304 response
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} else // Added for 304 response
return Response.success(new JSONObject(),HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
Log.v("Volley", "UnsupportedEncodingException " + response.statusCode);
if (response.statusCode == 200)// Added for 200 response
return Response.success(new JSONObject(), HttpHeaderParser.parseCacheHeaders(response));
else
return Response.error(new ParseError(e));
} catch (JSONException je) {
Log.v("Volley", "JSONException " + response.statusCode);
if (response.statusCode == 200)// Added for 200 response
return Response.success(new JSONObject(),HttpHeaderParser.parseCacheHeaders(response));
else
return Response.error(new ParseError(je));
}
}
这是解决这个问题的最佳方案吗?
谢谢!
编辑
检查 BasicNetwork.java 类我意识到 Volley 通过询问 httpResponse.getEntity() != null 来检查响应是否没有数据。
// Some responses such as 204s do not have content. We must check.
if (httpResponse.getEntity() != null) {
responseContents = entityToBytes(httpResponse.getEntity());
} else {// Add 0 byte response as a way of honestly representing a
// no-content request.
responseContents = new byte[0];
}
但问题仍然是当 Volley 尝试在 parseNetworkResponse 方法中使用response.data == new byte[0] 创建新字符串时发生的 JSONException。
【问题讨论】:
标签: android request android-volley jsonobject http-status-code-304