5

最新の 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 の結果が null になることはありませんが、空です。curl と postman をチェックして、自分の API が何も返していないことを確認しました (私が夢中にならないようにするためです)。他の誰かがそのような問題を抱えていますか?

今のところ、if を次のように変更しました。

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

根本的な原因を解決していないことはわかっていますが、この問題を深く掘り下げる前に、明らかなことを見逃していないことを確認したいと思います。

ありがとう!

編集: 申し訳ありませんが、実際の問題は、メソッド entityToBytes でタイムアウト例外が発生することであることに言及するのを忘れていました。取得するボディがないため、これは奇妙です。

また、まだ利用できないため、実際に完全に機能する Web サービス API は使用していません。代わりに、養蜂場でモックアウトされた Web サービスに接続していますが、養蜂場がどのように問題になるかわかりません。

4

2 に答える 2

7

これは、ソリューションの詳細よりも答えではありません。まず、API からの 204 応答を使用しましたが、まったく同じ問題がありました。私はそれを解決するために BasicNetwork.java であなたのコードを使用しました - 行if (statusCode != HttpStatus.SC_NO_CONTENT && httpResponse.getEntity() != null)

私が見つけたのは、標準のJsonObjectRequestリクエストを使用するResponse.ErrorListenerと、本文がnullだったためにトリガーされることでした。

JsonObjectRequestWithNullnull または空の本文の場合に成功応答を提供する新しいを作成しました。コード:

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

誰かに役立つことを願っています。

于 2015-04-02T07:14:59.187 に答える
3

カスタム HttpStack やそれに変更を加えずに標準の Volley ライブラリを使用している限り (gradle の依存関係: 'com.mcxiaoke.volley:library:1.0.15' をコンパイル)、含める必要がある唯一の変更はRequest クラスの parseNetworkResponse メソッド (これは、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));
    }
}
于 2015-09-30T22:34:55.190 に答える