如何使用其中一个表单数据字段是文件的 retrofit2 发出 POST 请求?
How to make POST request using retrofit2 where one of the form-data fields is a file?
我想使用 retrofit2 向我的 API 发出 png 上传请求。它必须是 POST 请求并且 png 作为表单数据字段 "img" 传递。我使用 Postman 测试了我的 API 并且一切正常,但现在我想使用 retrofit2 从 android 应用发出此请求。这个图书馆能提出这样的要求吗?
也许您可以为此尝试 Fast Android Networking 库,因为它既简单又快速 android 网络库。我创建了这个建立在 OKHttp 之上的库,并且比 Retrofit 具有更多的功能和定制。
在您的 gradle 文件中添加 depedencies
编译'com.amitshekhar.android:android-networking:0.0.1'
File file = new File(imagePath);
AndroidNetworking.upload(url)
.addMultipartFile("img",file)
.setTag("uploadTest")
.setPriority(Priority.HIGH)
.build()
.setUploadProgressListener(new UploadProgressListener() {
@Override
public void onProgress(long bytesUploaded, long totalBytes) {
// do anything with progress
}
})
.getAsJSONObject(new JSONObjectRequestListener() {
@Override
public void onResponse(JSONObject response) {
// do anything with response
}
@Override
public void onError(ANError error) {
// handle error
}
});
}
上传图片:
File file = new File("/storage/emulated/0/Pictures/MyApp/test.jpg");
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addPart(Headers.of("Content-Disposition",
"form-data; name=\"image\";filename=\""
+ file.getName() + "\""),
RequestBody.create(MEDIA_TYPE_JPG, file))
.build();
// Todo: replace with your own interface e.g. apiClient
Call<ResponseBody> call = apiClient.uploadImage(requestBody);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
Log.v("Upload", "success");
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.e("Upload error:", t.getMessage());
}
});
定义了示例接口和所需的端点方法:
public interface ApiClient {
@Multipart
@POST("/content")
Call<ResponseBody> uploadImage(@Part("image") RequestBody image);
}
我想使用 retrofit2 向我的 API 发出 png 上传请求。它必须是 POST 请求并且 png 作为表单数据字段 "img" 传递。我使用 Postman 测试了我的 API 并且一切正常,但现在我想使用 retrofit2 从 android 应用发出此请求。这个图书馆能提出这样的要求吗?
也许您可以为此尝试 Fast Android Networking 库,因为它既简单又快速 android 网络库。我创建了这个建立在 OKHttp 之上的库,并且比 Retrofit 具有更多的功能和定制。
在您的 gradle 文件中添加 depedencies
编译'com.amitshekhar.android:android-networking:0.0.1'
File file = new File(imagePath);
AndroidNetworking.upload(url)
.addMultipartFile("img",file)
.setTag("uploadTest")
.setPriority(Priority.HIGH)
.build()
.setUploadProgressListener(new UploadProgressListener() {
@Override
public void onProgress(long bytesUploaded, long totalBytes) {
// do anything with progress
}
})
.getAsJSONObject(new JSONObjectRequestListener() {
@Override
public void onResponse(JSONObject response) {
// do anything with response
}
@Override
public void onError(ANError error) {
// handle error
}
});
}
上传图片:
File file = new File("/storage/emulated/0/Pictures/MyApp/test.jpg");
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addPart(Headers.of("Content-Disposition",
"form-data; name=\"image\";filename=\""
+ file.getName() + "\""),
RequestBody.create(MEDIA_TYPE_JPG, file))
.build();
// Todo: replace with your own interface e.g. apiClient
Call<ResponseBody> call = apiClient.uploadImage(requestBody);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
Log.v("Upload", "success");
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.e("Upload error:", t.getMessage());
}
});
定义了示例接口和所需的端点方法:
public interface ApiClient {
@Multipart
@POST("/content")
Call<ResponseBody> uploadImage(@Part("image") RequestBody image);
}