Библиотека Android Volley, не работающая с 204 и пустой ответ тела

Я использую последнюю библиотеку Volley, и у меня возникают проблемы, когда мой api возвращает 204 без ответа в ответ. Кажется, что следующий код в BasicNetwork.java работает не так, как ожидалось:

// 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]; } 

Результат getEntity никогда не является нулевым для меня, но он пуст. Я убедился, что мой API ничего не возвращает, проверяя curl и postman (просто чтобы быть уверенным, что я не схожу с ума). У кого-нибудь еще такая проблема?

Пока я только что изменил это, если:

 if (statusCode != HttpStatus.SC_NO_CONTENT && httpResponse.getEntity() != null) 

Который я знаю, не решает первопричину, но я хочу убедиться, что я не пропущу ничего очевидного, прежде чем погрузиться в эту проблему глубже.

Благодаря!

EDIT: Извините, я забыл упомянуть, что фактическая проблема заключалась в том, что исключение тайм-аута происходит в то время как в методе entityToBytes, что странно, потому что нет тела для извлечения.

Кроме того, я не использую полностью функционирующий API webservice, поскольку он пока недоступен. Вместо этого я подключаюсь к издеваемому веб-сервису на пасеке, но я не вижу, как может возникнуть проблема с пасекой.

    Это меньше ответа, чем разработка вашего решения! Во-первых, я использую 204 ответа от моего API и имею ту же самую проблему, что и у вас. Я использовал ваш код в BasicNetwork.java для его решения – строка if (statusCode != HttpStatus.SC_NO_CONTENT && httpResponse.getEntity() != null)

    Я также обнаружил, что если я использую стандартный запрос JsonObjectRequest тогда срабатывает Response.ErrorListener , потому что тело было нулевым.

    Я создал новый JsonObjectRequestWithNull который обеспечивает успешный ответ в случае пустого или пустого тела. Код:

     public class JsonObjectRequestWithNull extends JsonRequest<JSONObject> { public JsonObjectRequestWithNull(int method, String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) { super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, errorListener); } public JsonObjectRequestWithNull(String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) { this(jsonRequest == null ? Request.Method.GET : Request.Method.POST, url, jsonRequest, listener, errorListener); } @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET)); //Allow null if (jsonString == null || jsonString.length() == 0) { return Response.success(null, HttpHeaderParser.parseCacheHeaders(response)); } return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } 

    }

    Соответствующий бит:

      //Allow null if (jsonString == null || jsonString.length() == 0) { return Response.success(null, HttpHeaderParser.parseCacheHeaders(response)); } 

    Надеюсь, полезно кому-то.

    До тех пор, пока вы используете стандартную библиотеку Volley без каких-либо пользовательских HttpStack или ее модификаций (зависимость gradle: compile 'com.mcxiaoke.volley: library: 1.0.15'), тогда единственное изменение, которое вам нужно будет включить, Метод parseNetworkResponse в вашем классе Request (предполагается, что вы используете Gson для преобразования в Json, это происходит из пользовательского класса GsonRequest, который я написал).

     @Override protected Response<T> parseNetworkResponse(NetworkResponse response) { try { final String json = new String( response.data, HttpHeaderParser.parseCharset(response.headers)); if (TextUtils.isEmpty(json)) { return Response.success(null, HttpHeaderParser.parseCacheHeaders(response)); } return Response.success(gson.fromJson(json, clazz), null); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JsonSyntaxException e) { return Response.error(new ParseError(e)); } }