Можно ли отправить @Fields с multipart в retrofit2? - PullRequest
0 голосов
/ 11 января 2019

Я использую Retrofit2, я отправлял данные через него, используя @FormUrlEncoded, потому что все было в виде строки, даже изображения, но я столкнулся с некоторыми ошибками, когда я отправляю коллекцию изображений в виде строк, поэтому я изменяю на multipart.

Теперь я столкнулся с проблемой, что я не могу отправить @Field of string с multipart.

Итак, как я могу решить эту проблему, не используя 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();
        }
    });

}

Ответы [ 2 ]

0 голосов
/ 11 января 2019

При использовании многочастных запросов с использованием 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 ; вам нужно будет передать его, создав RequestBody для дополнительных параметров как MIME-тип text/plain с использованием синтаксиса (i.e. RequestBody.create(MediaType.parse("text/plain"), your variable goes here))

Во время создания 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()));
0 голосов
/ 11 января 2019

попробуйте изменить @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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...