后台的接口请求方式可谓真的是各式各样,只有在不断的使用中累积在不同请求方式下的使用方法方可以满足日常开发需求;
以下则介绍一种通过Okhttp3 post方式上传文件的方式,其中需要格外注意的就是
Content-Type=multipart/form-data!
Content-Type=multipart/form-data!
Content-Type=multipart/form-data!
重要的事情说三遍;
首先是需要载入Okhttp3 库,也算是非常常用的库了
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
使用过程中也有一些疑惑,供大家一起讨论:
void subimt(String filePath, String fileName) {
OkHttpClient client = new OkHttpClient();
File file = new File(filePath);
RequestBody fileBody = RequestBody.create(MediaType.parse("image/jpeg"), file);//将file转换成RequestBody文件
RequestBody requestBody = new MultipartBody.Builder()
.setType(MediaType.parse("multipart/form-data; boundary=----WebKitFormBoundaryQC7A2hAquBA4IaJA"))//注意!需要在此处添加Content-Type
.addFormDataPart("File", fileName, fileBody)
.addFormDataPart("Name", "value")
.build();
Request request = new Request.Builder()
.url("url")
// .addHeader("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundaryQC7A2hAquBA4IaJA")//试着屏蔽此段代码,因为感觉无效,依旧会导致接口请求超时
.post(requestBody)
.build();
Log.d("上传图片测试", request.url().toString());
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d("上传图片测试", "onFailure: " + e.toString());
runOnUiThread(new Runnable() {//
@Override
public void run() {
Toast("上传失败");
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d("上传测试", "onResponse: " + response.body().string());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast("上传成功");
}
});
}
});
}
其中困扰我一段时间的就是为何在“Header”里面添加“Content-Type”好似无效一样,后台并不能接收到数据,接口一直是超时的状态,有懂的朋友可以解下惑,也是在海搜答案的时候看到可以在RequestBody设置“Content-Type”才得以解决;