如何使用其中一个表单数据字段是文件的 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);
}