【问题标题】:Sending string and images with retrofit multipart/form-data使用改造多部分/表单数据发送字符串和图像
【发布时间】:2020-06-11 11:57:49
【问题描述】:

我试图通过改造发送字符串和图像。

虽然我可以通过 x-www-form-urlencoded & hashmap 获得传递响应,但我需要将其与图像一起发送。所以我使用表单数据,但我无法获得具有相同名称和值的相同响应,在邮递员上对其进行了测试,它与我的 x-www-form 一样通过。

所以这里是邮递员 Postman request that got pass response

不通过的方法 带有表单数据

@Multipart
@POST("report")
fun push(
    @HeaderMap headers: Map<String, String>,
    @Part("store") string: RequestBody
): Call<ReportingResponse>


RequestBody.create(MediaType.parse("multipart/form-data"), "testing") //#1 fail
RequestBody.create(MediaType.parse("text/plain"), "testing") //#2 fail

我都试过了,都没有得到和邮递员一样的回复,看起来就是这样Retrofit request interceptor on Android Studio

通过的方法 使用 x-www-form

@FormUrlEncoded
@POST("report")
fun push(
    @HeaderMap headers: Map<String, String>,
    @FieldMap form: MutableMap<String, Any>
): Call<ReportingResponse>

我该怎么办?

【问题讨论】:

    标签: android kotlin retrofit retrofit2


    【解决方案1】:

    第 1 步:为调用改造 api 创建接口方法

     @POST(Const.Task_Ans_FILE_NAME)
    Call<TaskInfoBean>  verifyTaskAns(@Body RequestBody file);
    

    第 2 步:使用以下代码将多部分图像数据与正文中的其他字段一起发送。

    RetroFitService retroFitService = RetrofitClient.getAppData();
        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        if (answer_type.equals("1")) {
            builder.addFormDataPart(Const.ANSWER, answer);
        } else {
            try {
                builder.addFormDataPart(Const.ANSWER, Const.SelectedFileName, RequestBody.create(MultipartBody.FORM, Const.BOS.toByteArray()));
            }catch (Exception e){
                Log.e(TAG, "doInBackground: "+e.getMessage() );
            }
    
        }
        builder.addFormDataPart(Const.LOGIN_ID, login_id)
                .addFormDataPart(Const.USER_ID, user_id)
                .addFormDataPart(Const.PLAY_ID, play_id)
                .addFormDataPart(Const.TASK_ID, task_id)
                .addFormDataPart(Const.SCENARIO, scenario)
                .addFormDataPart(Const.ANSWER_TYPE,answer_type)
                .addFormDataPart(Const.SKIP, skip);
    
    
        final RequestBody requestBody = builder.build();
    
        Call<TaskInfoBean> call = retroFitService.verifyTaskAns(requestBody);
        call.enqueue(new Callback<TaskInfoBean>() {
            @Override
            public void onResponse(Call<TaskInfoBean> call, Response<TaskInfoBean> response) {
                if(response.code()==200) {
                    TaskInfoBean taskInfoBean = response.body();
                    listener.OnVerifyTaskAns(taskInfoBean);
                }else{
                    Log.e(TAG, "onResponse: "+response.toString() );
                }
            }
    
            @Override
            public void onFailure(Call<TaskInfoBean> call, Throwable t) {
                Log.e(TAG, "onFailure: " + t.toString());
            }
        });
        return null;
    }
    

    第 3 步:在您的活动/片段中调用此方法。

    【讨论】:

    • 很好的答案!!它还解决了文件对象的问题,因为在 Android 中我们通常获取 URI 或 ByteArray。直接用这段代码解决问题就行了
    猜你喜欢
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多