美文网首页
Volley form-data 提交数据

Volley form-data 提交数据

作者: satisfying | 来源:发表于2019-06-04 09:48 被阅读0次
    public class FormRequest extends Request<String> {
        private final String BOUNDARY = "------" + UUID.randomUUID().toString(); // 随机生成边界值
        private final String NEW_LINE = "\r\n"; // 换行符
        private final String MULTIPART_FORM_DATA = "multipart/form-data"; // 数据类型
        private String charSet = "utf-8"; // 编码
        private Map headers;
        private SuccessListener listener; // 监听
        private Map<String, Object> params; // 需要提交的参数
    
        public FormRequest(String url, Map<String, Object> params, SuccessListener listener, Response.ErrorListener errorListener) {
            //根据传递参数是否为null判断使用post还是get
            super(params == null ? Method.GET : Method.POST, url, errorListener);
            this.listener = listener;
            this.params = params;
        }
    
        public FormRequest(String url, Map<String, Object> params, String charSet, SuccessListener listener, Response.ErrorListener errorListener) {
            this(url, params, listener, errorListener);
            this.charSet = charSet;
        }
    
        //重载对返回数据的解析操作
        @Override
        protected Response<String> parseNetworkResponse(NetworkResponse response) {
            try {
                //获取response中的headers
                this.headers = response.headers;
                return Response.success(new String(response.data, HttpHeaderParser.parseCharset(response.headers)), HttpHeaderParser.parseCacheHeaders(response));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                // 解析异常
                return Response.error(new ParseError(e));
            }
        }
    
        /*将返回数据回调给监听接口*/
        @Override
        protected void deliverResponse(String response) {
            listener.onResponses(response, headers);
        }
    
        /**
         * 获取实体的方法,把参数拼接成表单提交的数据格式
         *
         * @return
         * @throws AuthFailureError
         */
        @Override
        public byte[] getBody() throws AuthFailureError {
            if (params == null || params.size() <= 0) {
                return super.getBody();
            }
            // ------WebKitFormBoundarykR96Kta4gvMACHfq                 第一行
            // Content-Disposition: form-data; name="login_username"    第二行
            //                                                          第三行
            // abcde                                                    第四行
            // ------WebKitFormBoundarykR96Kta4gvMACHfq--               结束行
            // 开始拼接数据
            StringBuffer stringBuffer = new StringBuffer();
            for (String key : params.keySet()) {
                Object value = params.get(key);
                stringBuffer.append("--" + BOUNDARY).append(NEW_LINE); // 第一行
                stringBuffer.append("Content-Disposition: form-data; name=\"").append(key).append("\"").append(NEW_LINE); // 第二行
                stringBuffer.append(NEW_LINE); // 第三行
                stringBuffer.append(value).append(NEW_LINE); // 第四行
            }
            // 所有参数拼接完成,拼接结束行
            stringBuffer.append("--" + BOUNDARY + "--").append(NEW_LINE);// 结束行
            try {
                return stringBuffer.toString().getBytes(charSet);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                // 使用默认的编码方式,Android为utf-8
                return stringBuffer.toString().getBytes();
            }
        }
    
        /**
         * 该方法的作用:在 http 头部中声明内容类型为表单数据
         *
         * @return
         */
        @Override
        public String getBodyContentType() {
            // multipart/form-data; boundary=----WebKitFormBoundarykR96Kta4gvMACHfq
            return MULTIPART_FORM_DATA + ";boundary=" + BOUNDARY;
        }
    
        //为了将返回数据的header信息传递出去声明新接口继承 Response.Listener
        public interface SuccessListener extends Response.Listener {
            public void onResponses(String responseDate, Map header);
        }
    }
    

    相关文章

      网友评论

          本文标题:Volley form-data 提交数据

          本文链接:https://www.haomeiwen.com/subject/dnakxctx.html