При отправке изображения с использованием multipart с использованием модифицированной библиотеки возникает эта ошибка.
Я проверил множество решений, доступных в Stack Overflow, но ни одно из них мне не помогло.
Здесь я предоставляю вам свой код:
public class ApiHandler {
private static final String BASE_URL = "https://aaplasevak.com/";
private static Retrofit retrofit;
public static Retrofit getRetrofitInstance() {
if (retrofit == null){
OkHttpClient client = new OkHttpClient.Builder().build();
Gson gson = new GsonBuilder().setLenient().create();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
return retrofit;
}
}
Мой класс интерфейса API
@Multipart
@POST("whatsapp_api.php")
Call<WhatsAppApiResponseData> sentWhatsAppMessage(
@Part("series_id") RequestBody seriesId,
@Part("colony_id") RequestBody colonyId,
@Part("row_id") RequestBody rowId,
@Part("watersupply_id") RequestBody waterSupplyId,
@Part("constituency") RequestBody constituency,
@Part("city_village") RequestBody cityVillage,
@Part("zone") RequestBody zone,
@Part("prabhag_ward") RequestBody prabhagWard,
@Part("template_desc") RequestBody templateDesc,
@Part MultipartBody.Part file
);
Код реализации API
private void sentWhatsAppMessage() {
ApiInterface apiInterface = getRetrofitInstance().create(ApiInterface.class);
RequestBody seriesId = RequestBody.create(MediaType.parse("multipart/form-data"), String.valueOf(spinner_series.getSelectedItemPosition()));
RequestBody colonyId = RequestBody.create(MediaType.parse("multipart/form-data"), String.valueOf(spinner_colony.getSelectedItemPosition() + 1));
RequestBody rowId = RequestBody.create(MediaType.parse("multipart/form-data"), String.valueOf(spinner_row.getSelectedItemPosition() + 1));
RequestBody waterSupplyId = RequestBody.create(MediaType.parse("multipart/form-data"), String.valueOf(spinner_water_Supply.getSelectedItemPosition()));
RequestBody zoneId = RequestBody.create(MediaType.parse("multipart/form-data"), String.valueOf(spinner_zone.getSelectedItemPosition()));
RequestBody wardId = RequestBody.create(MediaType.parse("multipart/form-data"), String.valueOf(spinner_ward.getSelectedItemPosition()));
RequestBody constituencyId = RequestBody.create(MediaType.parse("multipart/form-data"), String.valueOf(spinner_constituency.getSelectedItemPosition()));
RequestBody cityVillageId = RequestBody.create(MediaType.parse("multipart/form-data"), String.valueOf(spinner_city_village.getSelectedItemPosition()));
RequestBody message = RequestBody.create(MediaType.parse("multipart/form-data"), etMessage.getText().toString());
File file = new File(getRealPathFromURI(selectedUri));
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);
Call<WhatsAppApiResponseData> call = apiInterface.sentWhatsAppMessage(seriesId,colonyId,rowId,waterSupplyId,constituencyId,cityVillageId,zoneId,wardId,message,body);
//Log.d("Api Response", "WhatsApp: " + whatsAppApiBody.toString());
call.enqueue(new Callback<WhatsAppApiResponseData>() {
@Override
public void onResponse(Call<WhatsAppApiResponseData> call, retrofit2.Response<WhatsAppApiResponseData> response) {
if (response.isSuccessful()) {
WhatsAppApiResponseData responseData = response.body();
String status = responseData.toString();
Toast.makeText(WhatsappActivity.this, "Success!! " + status, Toast.LENGTH_SHORT).show();
Log.d("Api Response","data: " + status);
finish();
} else {
Toast.makeText(WhatsappActivity.this, "Response Error..!!", Toast.LENGTH_SHORT).show();
Log.e("Api Response", "Response Error..");
}
}
@Override
public void onFailure(Call<WhatsAppApiResponseData> call, Throwable throwable) {
Log.e("Api Response", "Error.." + throwable.getLocalizedMessage());
Toast.makeText(WhatsappActivity.this, "Error.." + throwable.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
throwable.printStackTrace();
}
});
}
Функция getRealPathFromUri
private String getRealPathFromURI(Uri contentUri) {
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(contentUri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String filePath = cursor.getString(column_index);
cursor.close();
return filePath;
}
При тестировании с помощью API Postman все работает нормально, но здесь я сталкиваюсь с проблемой, которая всегда показывает:
Данные Json не были полностью использованы
Установите тайм-аут в Retrofit, как показано ниже:
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(logging)
.connectTimeout(1, TimeUnit.MINUTES)
.readTimeout(1, TimeUnit.MINUTES)
.writeTimeout(1, TimeUnit.MINUTES)
.certificatePinner(certificatePinner)
.build();
API сейчас работает, единственное, что мне нужно изменить, это
RequestBody requestFile = RequestBody.create(MediaType.parse("image/jpeg"), файл);
// Необходимо заменить "multipart/form-data" на "image/jpeg" для изображения
нет, это тоже не работает