Volley exception error when response code 304 and 200

后端 未结 1 1255
无人及你
无人及你 2020-12-10 06:27

Playing around with the Volley library, I noticed that when making a POST JsonObjectRequest , if the server returns a code 304 or 200 with no data in the respon

相关标签:
1条回答
  • 2020-12-10 06:58

    Miguel- Isn't this method called only if its a success response?

    For all status codes <200 or status code >200 volley invokes parseNetworkError(VolleyError volleyError) instead of parseNetworkResponse(NetworkResponse response)method. Look here -

    https://android.googlesource.com/platform/frameworks/volley/+/master/src/com/android/volley/toolbox/BasicNetwork.java

    Line number -118-120

      if (statusCode < 200 || statusCode > 299) {
                    throw new IOException();
       }
    

    and the corresponding catch block Line number - 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);
                }
            }
    

    If you want to override this behavior you can add your status code specific implementation inside BasicNetwork.java->performRequest method.

    Edit : So its not because of status code but because of the empty response. Well I think you are doing the right thing implementing your custom Request class. Volley comes with a few predefined popular types of requests for ease of use, but you can always create your own. Instead of a status code based implementation i'd rather simply check if the following string is empty before deserialzing it -

    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));
    }
    

    **haven't tested this, but you get the point :)

    0 讨论(0)
提交回复
热议问题