web-dev-qa-db-ja.com

Volleyでエラー応答のコンテンツにアクセスする方法は?

これらの例のいずれかを使用: http://developer.Android.com/training/volley/request.html

成功したリクエストの応答を処理する方法、およびエラーを検出して対応する方法を理解しています。

ただし、エラーは(他の状況の中で)サーバーからの40倍または50倍の応答である場合があります。その場合、応答にはデータ(ヘッダーと本文)が含まれている可能性があります。

ただし、エラーリスナーには、VolleyErrorオブジェクト(誤っていない場合はExceptionのサブクラス)のみが渡され、Responseオブジェクトは渡されません。

エラー応答のコンテンツにアクセスするにはどうすればよいですか?

20
matteo

たとえばStringRequestの場合:

@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
    Map<String, String> responseHeaders = response.headers;
    if (response.statusCode == 401) {
        // Here we are, we got a 401 response and we want to do something with some header field; in this example we return the "Content-Length" field of the header as a successfully response to the Response.Listener<String>
        Response<String> result = Response.success(responseHeaders.get("Content-Length"), HttpHeaderParser.parseCacheHeaders(response));
        return result;
    } // else any other code that carries a message
    return super.parseNetworkResponse(response);
}
5
ADD

VolleyErrorオブジェクトにはnetworkResponse参照があり、それ自体に「data」メンバーがあります。これは、応答本文のバイト配列です。応答のエラーコードの場合にデータを表示する場合は、次のようなものを使用できます。

@Override
public void onErrorResponse(VolleyError error) {
    String body;
    //get status code here
    String statusCode = String.valueOf(error.networkResponse.statusCode);
    //get response body and parse with appropriate encoding
    if(error.networkResponse.data!=null) {
        try {
            body = new String(error.networkResponse.data,"UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
    //do stuff with the body...
}
37
bozzle