Volley直接设置POST包体

来源:互联网 发布:网络推广员有用吗 编辑:程序博客网 时间:2024/06/03 14:27

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<String, String> params = getParams();        if (params != null && params.size() > 0) {            return encodeParameters(params, getParamsEncoding());        }        return null;    }

从这里的返回值里面看到另外的一个方法,encodeParameters,点过去:

private byte[] encodeParameters(Map<String, String> params, String paramsEncoding) {        StringBuilder encodedParams = new StringBuilder();        try {            for (Map.Entry<String, String> 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即可。

总结

这里实际上最后的操作非常简单,就是重写了另外一个方法,但是中间的过程则是需要在之后遇到问题的时候再次用得到的,谢谢各位看官,么么哒。

2 0