安卓Volley设置post带参数请求

来源:互联网 发布:网络大电影宣传发行 编辑:程序博客网 时间:2024/06/05 02:08

Volley带参数POST请求方法一

. Volley请求最终会被封装成HttpRequest子类对象HttpUrlRequest,该方法在HttpClientStack中的createHttpRequest()方法

    @SuppressWarnings("deprecation")     protected  static HttpUriRequest createHttpRequest(Request<?> request,            Map<String, String>additionalHeaders) throws AuthFailureError {        switch (request.getMethod()) {            case Method.DEPRECATED_GET_OR_POST:{                byte[] postBody =request.getPostBody();                if (postBody != null) {                    HttpPost postRequest = new HttpPost(request.getUrl());                    postRequest.addHeader(HEADER_CONTENT_TYPE,request.getPostBodyContentType());                    HttpEntity entity;                    entity = new ByteArrayEntity(postBody);                   postRequest.setEntity(entity);                    return postRequest;                } else {                    return newHttpGet(request.getUrl());                }            }            case Method.GET:                return newHttpGet(request.getUrl());            case Method.DELETE:                return newHttpDelete(request.getUrl());            case Method.POST: {                HttpPost postRequest = new HttpPost(request.getUrl());               postRequest.addHeader(HEADER_CONTENT_TYPE,request.getBodyContentType());                //设置请求体 body信息 --post请求                setEntityIfNonEmptyBody(postRequest, request);                return postRequest;            }            case Method.PUT: {                HttpPut putRequest = new HttpPut(request.getUrl());               putRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType());               setEntityIfNonEmptyBody(putRequest, request);                return putRequest;            }            case Method.HEAD:                return new HttpHead(request.getUrl());            case Method.OPTIONS:                return new HttpOptions(request.getUrl());            case Method.TRACE:                return new HttpTrace(request.getUrl());            case Method.PATCH: {                HttpPatch patchRequest = newHttpPatch(request.getUrl());               patchRequest.addHeader(HEADER_CONTENT_TYPE,request.getBodyContentType());               setEntityIfNonEmptyBody(patchRequest, request);                return patchRequest;            }            default:                throw newIllegalStateException("Unknown request method.");        }    }

从上面代码中可以看到,当请求方式为POST的时候,会通过setEntityIfNonEmptyBody(postRequest, request) 的方式设置请求体;

setEntityIfNonEmptyBody(postRequest, request)

 /**     * 如果request的请求体不为空,进行设置请求体信息     * @param httpRequest     * @param request     * @throws AuthFailureError     */    private static void setEntityIfNonEmptyBody(HttpEntityEnclosingRequestBase httpRequest,            Request<?> request) throws AuthFailureError {        byte[] body = request.getBody();        if (body != null) {            HttpEntity entity = new ByteArrayEntity(body);            httpRequest.setEntity(entity);        }    }

接着,我们会发现,byte[] body = request.getBody(),是通过request的getBody()方法来获取参数的,接着看getVBody()方法:

request.getBody()

/**     * 如果请求是POST或者PUT方法,去获取请求参数信息,然后设置到请求中     */    public byte[] getBody() throws AuthFailureError {        //获取请求参数信息        Map<String, String> params =getParams();        if (params != null &¶ms.size() > 0) {            return encodeParameters(params,getParamsEncoding());        }        return null;    }

在这。会发现getBody()中是通过getParams()来获取参数map的,接着来看getParams():

getParams()

protected Map<String, String> getParams() throws AuthFailureError {        return null;    }

我们会发现,getParams()中直接返回了null,但是,可以修改Volley中的代码来使得POST请求携带参数

具体如下:

/**     * 自定义修改 新增POST请求参数map     */    protected Map<String,String> mParams=null;    public void setParams(Map<String,String> params) {        this.mParams = params;    }

在getParams()返回mParams:

/**     * 进行获取post请求参数数据     */    protected Map<String, String> getParams() throws AuthFailureError {        //return null;        //之前返回的为null,重新返回params        return mParams;    }

接着,对StringRequest类进行扩展一个构造方法

/**     * 扩展POST请求构造函数     * @param url 请求地址     * @param listener   数据请求加载成功监听器     * @param errorListener  数据请求加载失败监听器     * @param params  POST请求参数     */    public StringRequest(String url,Listener<String> listener, ErrorListenererrorListener,Map<String,String> params) {        this(Method.POST, url, listener,errorListener);        //进行初始化Request中post 请求参数        setParams(params);    }

之后,StringRequest携带参数请求

 String url = HttpUrl.LoginInUrl;RequestQueue requestQueue=Volley.newRequestQueue(this);              //修改Volley源代码,扩展StringRequest支持post参数设置                Map<String,String>params=new HashMap<String,String>();               params.put("username","admin");               params.put("password","110110");                StringRequest post_stringRequest=new StringRequest(url ,new Response.Listener<String>() {                    @Override                    public void onResponse(String response) {                         Log.e("response", "---" + response);                    }                }, new Response.ErrorListener(){                    @Override                    public void onErrorResponse(VolleyError error) {                            Log.e("onErrorResponse", "---" + error);                    }                },params);               requestQueue.add(post_stringRequest)

Volley带参数POST请求方法二

重写getParams()方法,返回参数集合

        String url = HttpUrl.LoginInUrl;        RequestQueue requestQueue = Volley.newRequestQueue(this);        StringRequest sr = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {            @Override            public void onResponse(String response) {                Log.e("response", "---" + response);        }, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError error) {                Log.e("onErrorResponse", "---" + error);            }        }) {            @Override            protected Map<String, String> getParams() {                Map<String, String> params = new HashMap<>();                params.put("mobile", phone_number.getText().toString());                params.put("password", password.getText().toString());                return params;            }        };        requestQueue.add(sr);
0 0
原创粉丝点击