【问题标题】:Retrofit - @Body parameters cannot be used with form or multi-part encoding. (parameter #1)Retrofit - @Body 参数不能与表单或多部分编码一起使用。 (参数#1)
【发布时间】:2016-08-26 21:35:17
【问题描述】:

我想将本地图库图片发送到 api。我已将图像添加为多部分类型文件,并且 iam 还在与多部分类型字符串相同的 api 中发送一些字符串数据。

所以当我点击 api 时,我得到了这个响应。

@Body 参数不能与表单或多部分编码一起使用。 (参数#1)

我的代码:

                //Add the values into Multipart.
                MultipartTypedOutput multipartTypedOutput = new MultipartTypedOutput();
                //Add the ACCESS_TOKEN
                //MULTIPLEIMAGE
                multipartTypedOutput.addPart(Constants.LOGO_IMAGE, new TypedFile("image/*", new File("" + encodedByte)));
                //Add the ACCESS_TOKEN
                multipartTypedOutput.addPart(Constants.COMPANY_NAME, new TypedString(companyName));
                multipartTypedOutput.addPart(Constants.TAGS, new TypedString(projectTags));
                multipartTypedOutput.addPart(Constants.PROJECT_DESC, new TypedString(projectDesc));
                multipartTypedOutput.addPart(Constants.CATEGORY, new TypedString(categories));
                multipartTypedOutput.addPart(Constants.STYLE, new TypedString(launchStyle));
                multipartTypedOutput.addPart(Constants.COLOR_CODE, new TypedString(colorCode));
                multipartTypedOutput.addPart(Constants.CONTEST_PACK, new TypedString(contestPackage));
                multipartTypedOutput.addPart(Constants.PAYMENT_GATE, new TypedString(paymentGateway));
                multipartTypedOutput.addPart(Constants.USERID, new TypedString(userId));
                if (connectionDetector.isOnline()) {
                    apiManager.getApiService().launchApi(multipartTypedOutput, new LaunchCallback(LaunchStep4Fragment.this));
                } else {
                    Toast.makeText(getActivity(), getString(R.string.check_internet), Toast.LENGTH_SHORT).show();
                }

接口方法

/**
 * @param multipartTypedOutput
 * @param callback
 */
@FormUrlEncoded
@POST(Constants.STORE_CONTEST)
void launchApi(@Body MultipartTypedOutput multipartTypedOutput , Callback<LaunchResponse> callback);

在 api 方面,他们将所有内容都作为字符串获取。那么是看参数类型还是代码问题呢?

我应该改变什么才能得到结果?

如果我做错了什么,请有人解释一下。

【问题讨论】:

    标签: android retrofit


    【解决方案1】:

    使用改造 2

    @Headers({
            "Accept: application/json",
    })
    @Multipart
    @POST("upload")
    Call<ResponseBody> uploadImage(@Part("picture\"; filename=\"picture") RequestBody picture, @Part("company_name") RequestBody company_name);
    

    【讨论】:

    • 所以,我必须一一发送每个参数。你能给我举个例子来发送像这样 Multipart 的图像值吗? MultipartTypedOutput multipartTypedOutput = new MultipartTypedOutput(); multipartTypedOutput.addPart(Constants.LOGO_IMAGE, new TypedFile("image/*", new File("" + encodedByte)));
    • Uri pics = Uri.fromFile(new File(finalPath)); Bitmap bitmap1 = decodeBitmap(pics, finalPath); ByteArrayOutputStream byteArrayOutputStream1 = new ByteArrayOutputStream(); bitmap1.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream1); RequestBody fbody = RequestBody.create(MediaType.parse("multipart/form-data"), byteArrayOutputStream1.toByteArray()); RequestBody name = RequestBody.create(MediaType.parse("text/plain"), company name string);
    【解决方案2】:

    尝试删除@FormUrlEncoded 我遇到了与删除@FormUrlEncoded 相同的错误并且它起作用了

     //@FormUrlEncoded
        @POST("saveOgrYoklama")
        Call<YoklamaStatus> sendYoklamaList2(@Body Yoklama yoklama);
    

    我试图发送到服务器的内容

    【讨论】:

      猜你喜欢
      • 2015-02-03
      • 2017-01-05
      • 1970-01-01
      • 2023-03-24
      • 2017-03-09
      • 2020-04-28
      • 2013-01-03
      • 2014-04-20
      • 1970-01-01
      相关资源
      最近更新 更多