Volley直接設定POSTパッケージ

5750 ワード

Volley直接設定POSTパッケージ
事件の起源
今、他の人の二次開発を手伝っているので、バックグラウンドの人がいるのはすべて天井で、ピンインが8級を超えた人材です.また,ネットワークリクエスト方式も奇抜で,キー値ペアではなくJSON文字列をPOSTパッケージに入れてリクエストする.
これまでカプセル化されていたVolleyヘルプクラスをここに置くと、POSTパッケージを直接設定する要求方法が追加されます.しかし、ネット上ではgetParamsメソッドを書き換えてVolleyに要求パラメータを設定していることが分かった.それはできません.私は一番やりたくないことを無理にするしかありません.--ソースコードを見てください.
どこから手をつけますか.
誰もがgetParamsメソッドを書き換えると言っているので、まずこのgetParamsメソッドが具体的にどのような操作をしているのかを見てみましょう.StringRequestというクラスを使って、それからポイントして、Requestというクラスを継承しているのを見て、コードは以下の通りです.
public class StringRequest extends Request<String> {
    private final Listener<String> mListener;

    public StringRequest(int method, String url, Listener<String> listener,
            ErrorListener errorListener) {
        super(method, url, errorListener);
        mListener = listener;
    }

    public StringRequest(String url, Listener<String> listener, ErrorListener errorListener) {
        this(Method.GET, url, listener, errorListener);
    }

    @Override
    protected void deliverResponse(String response) {
        mListener.onResponse(response);
    }

    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        String parsed;
        try {
            parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        } catch (UnsupportedEncodingException e) {
            parsed = new String(response.data);
        }
        return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
    }
}

明らかにこの中には私たちが探しているgetParamsの方法がありません.では、下に行ってRequestというクラスに入ります.このクラスにはコードがたくさんあります.getParamsを検索すると、getBodyメソッドで呼び出されます.
public byte[] getBody() throws AuthFailureError {
        Map params = getParams();
        if (params != null && params.size() > 0) {
            return encodeParameters(params, getParamsEncoding());
        }
        return null;
    }

ここの戻り値から別の方法が見えます.encodeParameters、ポイント:
private byte[] encodeParameters(Map params, String paramsEncoding) {
        StringBuilder encodedParams = new StringBuilder();
        try {
            for (Map.Entry entry : params.entrySet()) {
                encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding));
                encodedParams.append('=');
                encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding));
                encodedParams.append('&');
            }
            return encodedParams.toString().getBytes(paramsEncoding);
        } catch (UnsupportedEncodingException uee) {
            throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee);
        }
    }

実はここでmapを遍歴して文字列につなぎ合わせてから変換したbyte[]がgetBodyに戻り、最終的にPOSTのリクエストパッケージになったのを見ました.
どのように修正しますか?
リクエストを開始した場所に戻る必要があります.getParamsという方法は書き換えません.getBodyの方法を書き換える必要があります.
            @Override
            public byte[] getBody() {
                try {
                    return body.getBytes(getParamsEncoding());
                } catch (UnsupportedEncodingException e) {
                    return null;
                }
            }

ここのbodyはパッケージの文字列で、Volleyで自分でカプセル化したgetParamsEncodingを呼び出せばいいです.
まとめ
ここでは実際に最後の操作は非常に簡単で、別の方法を書き直すことですが、中間の過程は後で問題が発生したときに再び使う必要があります.