首页 > 解决方案 > 改造 - @Part MultipartBody.Part 未触发 API

问题描述

改造调用适用于我的 API,例如:

@POST("addeventphoto")
Call<NewPhotoObject> listRepos(@Query("key1") String testKey);
RetrofitInterfaces.IPostNewMessage service = RetrofitClientInstance.getRetrofitInstance().create(RetrofitInterfaces.IPostNewMessage.class);
        Call<NewPhotoObject> call = service.listRepos("hello");
        call.enqueue(new Callback<NewPhotoObject>() {
            @Override
            public void onResponse(Call<NewPhotoObject> call, Response<NewPhotoObject> response) {
                Log.d(TAG, "onResponse: " + response.body());
                if(response.isSuccessful() && response.body() != null){
                    Log.d(TAG, "onResponse: " + response.body().getEvent_photo());
                }

            }

            @Override
            public void onFailure(Call<NewPhotoObject> call, Throwable t) {
                Log.d(TAG, "onFailure: " + t);
            }
        });

我的 API 被触发,我得到了回复。然而,一旦我添加@Multipart到我的改造界面......我的 API 不再被触发。

@Multipart
@POST("addeventphoto")
Call<NewPhotoObject> listRepos(@Query("key1") String testKey, @Part MultipartBody.Part image);

我是否错误地使用改造?当前版本:

implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

编辑:与 MultipartBody.Part 一起使用

File file = new File(imagePath);
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("image", file.getName(), requestFile);

RetrofitInterfaces.IPostNewMessage service = RetrofitClientInstance.getRetrofitInstance().create(RetrofitInterfaces.IPostNewMessage.class);
        Call<NewPhotoObject> call = service.listRepos("hello", body);
        call.enqueue(new Callback<NewPhotoObject>() {
            @Override
            public void onResponse(Call<NewPhotoObject> call, Response<NewPhotoObject> response) {
                Log.d(TAG, "onResponse: " + response.body());
                if(response.isSuccessful() && response.body() != null){
                    Log.d(TAG, "onResponse: " + response.body().getEvent_photo());
                }

            }

            @Override
            public void onFailure(Call<NewPhotoObject> call, Throwable t) {
                Log.d(TAG, "onFailure: " + t);
            }
        });

标签: androidretrofitretrofit2

解决方案


我使用的是 API Gateway + Lambda,您需要手动启用二进制支持才能接受MultipartBody.Part类型。这就是它成功发送的原因,但我的 API 没有被触发。

https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-configure-with-console.html


推荐阅读