Android OkHttp Post上傳檔案并且攜帶參數
這裡整理一下 OkHttp 的 post 在上傳檔案的同時,也要攜帶請求參數的方法。
使用 OkHttp 版本如下:
compile 'com.squareup.okhttp3:okhttp:3.4.1'
代碼如下:
protected void post_file(final String url, final Map map, File file) {
OkHttpClient client = new OkHttpClient();
// form 表單形式上傳
MultipartBody.Builder requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM);
if(file != null){
// MediaType.parse() 裡面是上傳的檔案類型。
RequestBody body = RequestBody.create(MediaType.parse("image/*"), file);
String filename = file.getName();
// 參數分别為, 請求key ,檔案名稱 , RequestBody
requestBody.addFormDataPart("headImage", file.getName(), body);
}
if (map != null) {
// map 裡面是請求中所需要的 key 和 value
for (Map.Entry entry : map.entrySet()) {
requestBody.addFormDataPart(valueOf(entry.getKey()), valueOf(entry.getValue()));
}
}
Request request = new Request.Builder().url("請求位址").post(requestBody.build()).tag(context).build();
// readTimeout("請求逾時時間" , 時間機關);
client.newBuilder().readTimeout(5000, TimeUnit.MILLISECONDS).build().newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i("lfq" ,"onFailure");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String str = response.body().string();
Log.i("lfq", response.message() + " , body " + str);
} else {
Log.i("lfq" ,response.message() + " error : body " + response.body().string());
}
}
});
}
這裡說明一點,就是 MultipartBody.Builder 的 addFormDataPart 方法,是對于之前的 addPart 方法做了一個封裝,是以,不需要再去配置 Header 之類的。
如果隻是單純的 Post 攜帶參數,那麼直接使用 FormBody ,代碼如下:
FormBody.Builder formBody = new FormBody.Builder();
if (map != null) {
for (Map.Entry entry : map.entrySet()) {
formBody.add(String.valueOf(entry.getKey()),String.valueOf(entry.getValue()));
}
}
以上隻是針對項目中遇到的問題進行整理,需要了解更多,請自行查閱大神們的解析。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支援!