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 提交数据
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 该方式提交表单数据以什么形式传递给服务器?抓包分析 1 这种方式发送到服务器的数据,需要一些其他方法处理才能还原原...
- 使用Volley传输网络数据(Transmitting Network Data Using Volley) Vo...
- 前段时间处理上传文件时遇到了一些问题 multipart/form-data 方式提交的请求 在无法用 Filt...
- 一个网站的数据是form-data形式提交的 直接post会失败,实现 请求成功,返回结果为: 第二种方式,使用u...