特此记录:
问题:
/**
* 上传图片的接口,由于只有一个请求头,没有其它参数,我就直接写的完整接口:https://***.com/api/member/uploadAvatar
* baseUrl 必须以'/'结尾,否则会报错
*/
public static final String BASE_URL = "https://***.com/api/member/uploadAvatar/";
@Headers("token: 31b5f356e232acac6994df7")
@Multipart
@POST("/") // 没有参数时,必须要有字符'/',否则会报错
Call<String> upload(@Part MultipartBody.Part part);
RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpeg"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
TestService testService = new Retrofit.Builder()
.baseUrl(BASE_URL) // 有文章说某种情况可以不设置,经验证,不设置会报错
.addConverterFactory(ScalarsConverterFactory.create())
.build().create(TestService.class);
Call<String> upload = testService.upload(body);
upload.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {}
@Override
public void onFailure(Call<String> call, Throwable t) {}
});
在onResponse里打印居然出现了诡异H5代码,通过抓包发现图片是有上传的,不过中间发生了 Response Code:302
然后开始了纠结的排错流程:
Postman 调试接口 -- 无异常
直接使用Okhttp上传图片 -- 无异常
。。。。。。_(°:з」∠)_
最终发现异常请求的URL只有一部分,即:https://***.com/
而正常请求的URL是:https://***.com/api/member/uploadAvatar
解决:经过验证,确认是 baseUrl 的设置有问题,一共发现三种可行的设置方式
第一种:
public static final String BASE_URL = "https://***.com/";
@Headers("token: 31b5f356e232acac6994df7")
@Multipart
@POST("api/member/uploadAvatar")
Call<String> upload(@Part MultipartBody.Part part);
第二种:
public static final String BASE_URL = "https://***.com/api/member/";
@Headers("token: 31b5f356e232acac6994df7")
@Multipart
@POST("uploadAvatar")
Call<String> upload(@Part MultipartBody.Part part);
第三种:
public static final String BASE_URL = "https://***.com/api/member/uploadAvatar/";
@Headers("token: 31b5f356e232acac6994df7")
@Multipart
@POST(BASE_URL)
Call<String> upload(@Part MultipartBody.Part part);