版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33718648/article/details/82012676
volley默认没有提供提交表单数据的接口。因此需要我们继承Request<String>实现FormRequest提供提交表单的功能
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);
}
}
使用方法:
//chua
RequestQueue mRequestQueue = Volley.newRequestQueue(mWXSDKInstance.getContext());
/*********Volley对网络请求封装*********/
FormRequest formRequest=new FormRequest(url, usepost?param:null, new FormRequest.SuccessListener() {
@Override
public void onResponse(Object o) {
//原始的接口成功的回调
}
@Override
public void onResponses(String responseDate, Map header) {
//自定义的的接口成功的回调,可以获取header信息
}
}, new com.android.volley.Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
//接口调用失败的回调
}
}){
//重载getHeaders()方法设置请求的头信息
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return header;
}
};
//设置缓存,默认为true
formRequest.setShouldCache(false);
//设置请求超时和超时重试参数
formRequest.setRetryPolicy(new DefaultRetryPolicy(
60000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
//将请求添加到请求队列
mRequestQueue.add(formRequest);
参考文章:https://blog.csdn.net/itrenj/article/details/59795669