【问题标题】:Is it possible to send @Fields with multipart in retrofit2?是否可以在 retrofit2 中发送带有 multipart 的 @Fields?
【发布时间】:2019-01-11 17:18:23
【问题描述】:

我正在使用retrofit2,我使用@FormUrlEncoded 通过它发送数据,因为所有内容都作为字符串甚至图像,但是当我将图像集合作为字符串发送时我遇到了一些错误,所以我更改为多部分。

现在我面临的问题是我无法使用多部分发送@Field 字符串。

那么,如何在不对每个字符串都使用 RequestBody 的情况下解决这个问题呢?

这是我的代码

@Multipart
@POST("/androidfiles/insertNews.php")
Call<ResponseBody> uploadImage(@Part MultipartBody.Part file, @Part("name") RequestBody name,
                               @Field("tArabic") String arabicTitle,
                               @Field("tEnglish") String englishTitle,
                               @Field("tRussian") String russianTitle,
                               @Field("tItalian") String italianTitle,
                               @Field("dArabic") String arabicDescription,
                               @Field("dEnglish") String englishDescription,
                               @Field("dRussian") String russianDescription,
                               @Field("dItalian") String italianDescription);

这里。

private void insertNews(Uri uri){

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(ServiceConstants.URL)
            .build();


    File file = FileUtil.getFile(this, uri);

    RequestBody mFile = RequestBody.create(MediaType.parse("image/*"), file);
    MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", file.getName(), mFile);
    RequestBody filename = RequestBody.create(MediaType.parse("text/plain"), file.getName());

    ApiConfig apiConfig = retrofit.create(ApiConfig.class);

    Call<ResponseBody> addNews = apiConfig.uploadImage(fileToUpload,
            filename,
            etArabicTitle.getText().toString(),
            etEnglishTitle.getText().toString(),
            etRussianTitle.getText().toString(),
            etItalianTitle.getText().toString(),
            etArabicDescription.getText().toString(),
            etEnglishDescription.getText().toString(),
            etRussianDescription.getText().toString(),
            etItalianDescription.getText().toString());

    addNews.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            Toast.makeText(News.this, "success" + "\n" + response.message(), Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(News.this,Menu.class);
            startActivity(intent);
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Toast.makeText(News.this, "fail" + t.getMessage(), Toast.LENGTH_SHORT).show();
            t.printStackTrace();
        }
    });

}

【问题讨论】:

    标签: android retrofit2


    【解决方案1】:

    当通过 Retrofit 使用 多部分请求 时,您可以使用 @Part 注释传递额外参数,其中 RequestBody 字段用于附加参数。

    因此,您可以将它作为RequestBody 类型传递给除多部分主体之外的所有参数,如下所示:

    @Multipart
    @POST("/androidfiles/insertNews.php")
    Call<ResponseBody> uploadImage(@Part MultipartBody.Part file,
                                   @Part("name") RequestBody name,
                                   @Part("tArabic") RequestBody arabicTitle,
                                   @Part("tEnglish") RequestBody englishTitle,
                                   @Part("tRussian") RequestBody russianTitle,
                                   @Part("tItalian") RequestBody italianTitle,
                                   @Part("dArabic") RequestBody arabicDescription,
                                   @Part("dEnglish") RequestBody englishDescription,
                                   @Part("dRussian") RequestBody russianDescription,
                                   @Part("dItalian") RequestBody italianDescription);
    

    现在,调用这样的API;您需要通过使用语法 (i.e. RequestBody.create(MediaType.parse("text/plain"), your variable goes here))

    创建 RequestBody 作为 MIME 类型 text/plain 的附加参数来传递它

    在 API 构建期间,您可以将其调用为:

    Call<ResponseBody> addNews = apiConfig.uploadImage(fileToUpload,
                filename,
                RequestBody.create(MediaType.parse("text/plain"), etArabicTitle.getText().toString()), //This will make it as RequestBody to pass it along image/files.
                RequestBody.create(MediaType.parse("text/plain"), etEnglishTitle.getText().toString()),
                RequestBody.create(MediaType.parse("text/plain"), etRussianTitle.getText().toString()),
                RequestBody.create(MediaType.parse("text/plain"), etItalianTitle.getText().toString()),
                RequestBody.create(MediaType.parse("text/plain"), etArabicDescription.getText().toString()),
                RequestBody.create(MediaType.parse("text/plain"), etEnglishDescription.getText().toString()),
                RequestBody.create(MediaType.parse("text/plain"), etRussianDescription.getText().toString()),
                RequestBody.create(MediaType.parse("text/plain"), etItalianDescription.getText().toString()));
    

    【讨论】:

    • 乐于助人:)
    【解决方案2】:

    尝试将 @Field 更改为 @Part 。像这样:

        @Multipart
    @POST("/androidfiles/insertNews.php")
    Call<ResponseBody> uploadImage(@Part MultipartBody.Part file, @Part("name") RequestBody name,
                                   @Part("tArabic") String arabicTitle,
                                   @Part("tEnglish") String englishTitle,
                                   @Part("tRussian") String russianTitle,
                                   @Part("tItalian") String italianTitle,
                                   @Part("dArabic") String arabicDescription,
                                   @Part("dEnglish") String englishDescription,
                                   @Part("dRussian") String russianDescription,
                                   @Part("dItalian") String italianDescription);
    

    【讨论】:

      猜你喜欢
      • 2018-11-14
      • 1970-01-01
      • 2012-06-11
      • 2022-01-16
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      相关资源
      最近更新 更多