package com.cheng.networkframestudy.okhttp.frame.request;
import com.cheng.networkframestudy.okhttp.frame.OkHttpUtil;
import com.cheng.networkframestudy.okhttp.frame.builder.PostFormBuilder;
import com.cheng.networkframestudy.okhttp.frame.callback.Callback;
import java.net.FileNameMap;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.Request;
import okhttp3.RequestBody;
/**
* 李旺成
* 2016年2月20日08:22:34
*/
public class PostFormRequest extends OkHttpRequest {
private List<PostFormBuilder.FileInput> mFileList;
public PostFormRequest(String url, Object tag, Map<String, String> params, Map<String, String> headers, List<PostFormBuilder.FileInput> files) {
super(url, tag, params, headers);
this.mFileList = files;
}
@Override
protected RequestBody buildRequestBody() {
if (mFileList == null || mFileList.isEmpty()) {
FormBody.Builder builder = new FormBody.Builder();
addParams(builder);
return builder.build();
} else {
MultipartBody.Builder builder = new MultipartBody.Builder()
.setType(MultipartBody.FORM);
addParams(builder);
int filesSize = mFileList.size();
for (int i = 0; i < filesSize; i++) {
PostFormBuilder.FileInput fileInput = mFileList.get(i);
RequestBody fileBody = RequestBody.create(MediaType.parse(guessMimeType(fileInput.filename)), fileInput.file);
builder.addFormDataPart(fileInput.key, fileInput.filename, fileBody);
}
return builder.build();
}
}
@Override
protected RequestBody wrapRequestBody(RequestBody requestBody, final Callback callback) {
if (callback == null) return requestBody;
CountingRequestBody countingRequestBody = new CountingRequestBody(requestBody, new CountingRequestBody.Listener() {
@Override
public void onRequestProgress(final long bytesWritten, final long contentLength) {
OkHttpUtil.getInstance().getDelivery().post(new Runnable() {
@Override
public void run() {
callback.inProgress(bytesWritten * 1.0f / contentLength);
}
});
}
});
return countingRequestBody;
}
@Override
protected Request buildRequest(Request.Builder builder, RequestBody requestBody) {
return builder.post(requestBody).build();
}
private String guessMimeType(String path) {
FileNameMap fileNameMap = URLConnection.getFileNameMap();
String contentTypeFor = fileNameMap.getContentTypeFor(path);
if (contentTypeFor == null) {
contentTypeFor = "application/octet-stream";
}
return contentTypeFor;
}
private void addParams(MultipartBody.Builder builder) {
if (mParamMap != null && !mParamMap.isEmpty()) {
for (String key : mParamMap.keySet()) {
builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + key + "\""),
RequestBody.create(null, mParamMap.get(key)));
}
}
}
private void addParams(FormBody.Builder builder) {
if (mParamMap == null || mParamMap.isEmpty()) {
builder.add("1", "1");
return;
}
for (String key : mParamMap.keySet()) {
String value = mParamMap.get(key);
if (value == null) continue;
builder.add(key, value);
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(super.toString());
if (mFileList != null) {
for (PostFormBuilder.FileInput file : mFileList) {
sb.append(file.toString() + " ");
}
}
return sb.toString();
}
}