在使用Volley库时,我注意到在进行POST时JsonObjectRequest
,如果服务器返回的代码304或200没有响应中的数据(response.data)
,Volley会将其解释为错误响应,而不是成功。
我设法通过Response<JSONObject> parseNetworkResponse(NetworkResponse response)
在类的方法中添加几行代码来解决该问题JsonObjectRequest.java
。
@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尝试response.data == new byte[0]
在parseNetworkResponse方法中使用创建新字符串时发生的JSONException。
Miguel-仅在成功响应后才调用此方法吗?
对于所有状态代码<200或状态代码> 200,Volley调用parseNetworkError(VolleyError
volleyError)而不是parseNetworkResponse(NetworkResponse response)方法。看这里 -
https://android.googlesource.com/platform/frameworks/volley/+/master/src/com/android/volley/toolbox/BasicNetwork.java
行号-118-120
if (statusCode < 200 || statusCode > 299) {
throw new IOException();
}
和相应的捕获块行号-128 -151
catch (IOException e) {
int statusCode = 0;
NetworkResponse networkResponse = null;
if (httpResponse != null) {
statusCode = httpResponse.getStatusLine().getStatusCode();
} else {
throw new NoConnectionError(e);
}
VolleyLog.e("Unexpected response code %d for %s", statusCode, request.getUrl());
if (responseContents != null) {
networkResponse = new NetworkResponse(statusCode, responseContents,
responseHeaders, false);
if (statusCode == HttpStatus.SC_UNAUTHORIZED ||
statusCode == HttpStatus.SC_FORBIDDEN) {
attemptRetryOnException("auth",
request, new AuthFailureError(networkResponse));
} else {
// TODO: Only throw ServerError for 5xx status codes.
throw new ServerError(networkResponse);
}
} else {
throw new NetworkError(networkResponse);
}
}
如果要覆盖此行为,可以在BasicNetwork.java-> performRequest方法内添加特定于状态码的实现。
编辑:所以它不是因为状态码而是因为响应为空。好吧,我认为您在实现自定义Request类方面做得正确。Volley随附了一些预定义的流行请求类型,以简化易用性,但您始终可以创建自己的请求。与其基于状态码的实现,不如直接反序列化之前检查以下字符串是否为空-
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
if (!jsonString .isEmpty()) {
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
}
else {
return Response.success(new JSONObject(),
HttpHeaderParser.parseCacheHeaders(response));
}
**尚未测试过,但您明白了:)
2.)AVD没有互联网问题(原因稍后解释)。 3.)与我的volley singleton类或请求队列无关(原因稍后解释)。 所以我想我在Volley/Request Future的用法上犯了某种错误。
本文向大家介绍HTTP 状态码 304和 200 的区别?相关面试题,主要包含被问及HTTP 状态码 304和 200 的区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 状态码200:请求已成功,请求所希望的响应头或数据体将随此响应返回。即返回的数据为全量的数据,如果文件不通过GZIP压缩的话,文件是多大,则要有多大传输量。 状态码304:如果客户端发送了一个带条件的 GET 请求且
创建一个 API 的时候处理错误是很痛苦的。为了避免手动的创建错误响应,你可以简单的抛出一个继承了 Symfony\Component\HttpKernel\Exception\HttpException 的异常,API 会自动的为你处理响应。 这里是 Symfony 内置的异常列表。 异常 状态码 Symfony\Component\HttpKernel\Exception\AccessDeni
我使用spring-boot(v2 M3)和Spring-WebFlux进行一个项目。在编写一个特性时,我看到我的微服务返回一个HTTP200状态代码,同时在流量中返回一个错误。 使用一个简单的异常处理程序: 我在集成测试中用webTestClient测试结果: 结果,我的测试失败了,因为返回错误通量的控制器返回的是200状态码,而不是503状态码(异常日志“test”在我的控制台中被很好地跟踪)
问题内容: 我在使用排球库发出网络请求时遇到此错误,我遵循以下链接Android Volley- BasicNetwork.performRequest:意外的响应代码400和意外的响应代码404凌空,但在我的情况下它们都不起作用。这是我的请求代码 有谁能告诉我我的代码在哪里做错了?任何帮助都是可观的。 问题答案: 通常,此响应是由发送错误的URL参数引起的。请检查每个参数的拼写,并确保是否以字符
问题陈述: 我正在尝试访问一个REST API,它将使用Volley返回一个用于各种HTTP状态代码(400、403、200等)的JSON对象。