Не удается установить Content-Type для MultipartBody.Part в OkHttp

После нескольких часов борьбы с этой проблемой я, наконец, решил спросить совета здесь. Я использую Retrofit 2 для работы в сети в своем приложении. Вот как выглядит мой метод в интерфейсе API для загрузки изображений:

@POST(UPLOAD_PHOTO)
@Multipart
Call<UploadPhotoResponse> uploadPhoto(@Header("X-Auth-Token") String token, @Path("post_id") int postId
        , @Part("photo\"; filename=\"cover.jpg\"") MultipartBody.Part photo, @Part("photo_thumb\"; filename=\"cover_thumb.jpg\" ") MultipartBody.Part photoThumb);

Объявление так, как я это называю:

    RequestBody photoBody = RequestBody.create(MediaType.parse("image/jpeg"),bytePhoto);
    RequestBody thumbBody = RequestBody.create(MediaType.parse("image/jpeg"), byteThumb);
    MultipartBody.Part photoPart = MultipartBody.Part.createFormData("photo", photoFile.getName(), photoBody);
    MultipartBody.Part thumbPart = MultipartBody.Part.createFormData("photo_thumb", thumbFile.getName(), thumbBody);
    Call<UploadPhotoResponse> call = apiService
            .uploadPhoto(sessionToken, postId, photoPart, thumbPart);
    call.enqueue(new Callback<UploadPhotoResponse>() {
        @Override
        public void onResponse(Response<UploadPhotoResponse> response, Retrofit retrofit) {

        }

        @Override
        public void onFailure(Throwable t) {

        }
    });

Моя проблема в том, что я получаю сообщение об ошибке с сервера из-за неверных параметров тела. В некоторых случаях Content-Type для каждой части устанавливается в «application/json», как вы можете видеть на экране Fiddler: Параметры тела запроса

Единственное обсуждение, относящееся к моей проблеме, которое мне удалось найти, это Многочастный запрос, переопределяющий тип содержимого, не работает #1433

Но речь идет о типе контента для заголовка запроса, а не для части тела. Может быть кто-то сталкивался с подобной проблемой с OkHttp, потому что теперь я ничего не могу сказать, что может решить мою проблему, кроме переключения с этой библиотеки для этого конкретного запроса.


person Yurii    schedule 27.06.2016    source источник


Ответы (1)


В настоящее время я испытываю ту же проблему, поскольку я пытаюсь отправить строку и изображение, оба должны быть multipart/form-data.

Вот как выглядит интерфейс:

@Multipart
    @POST("photos/setPhotos")
    Observable<SetPhotoResponseWrapper> uploadPhoto(@Part("userHash") RequestBody userHash, @Part("photos[]") MultipartBody.Part file);

И как создаются объекты:

RequestBody reqFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);

        MultipartBody.Part multipart = MultipartBody.Part.createFormData("picture", file.getName(), reqFile);

        RequestBody userBody = RequestBody.create(MediaType.parse("multipart/form-data"), userHash);

А вот логи от okHttp:

Content-Disposition: form-data; name="userHash"
10-12 14:23:43.951 29991-30723/com.gigrev.gigkev D/OkHttp: Content-Transfer-Encoding: binary
10-12 14:23:43.951 29991-30723/com.gigrev.gigkev D/OkHttp: Content-Type: multipart/form-data; charset=utf-8
10-12 14:23:43.951 29991-30723/com.gigrev.gigkev D/OkHttp: Content-Length: 32
10-12 14:23:43.952 29991-30723/com.gigrev.gigkev D/OkHttp: Content-Disposition: form-data; name="photos[]"
10-12 14:23:43.952 29991-30723/com.gigrev.gigkev D/OkHttp: Content-Transfer-Encoding: binary
10-12 14:23:43.952 29991-30723/com.gigrev.gigkev D/OkHttp: Content-Type: application/json; charset=UTF-8
10-12 14:23:43.952 29991-30723/com.gigrev.gigkev D/OkHttp: Content-Length: 111
10-12 14:23:43.952 29991-30723/com.gigrev.gigkev D/OkHttp: {"headers":{"namesAndValues":["Content-Disposition","form-data; name=\"picture\"; filename=\"IMAG0203.jpg\""]}}

Поскольку серверная часть не принимает json, я должен разобраться с этим на своей стороне. Вам удалось найти решение?

РЕДАКТИРОВАТЬ: я действительно нашел решение. Только что обновил модифицированную версию, и вот что теперь я получаю в журналах:

 Content-Disposition: form-data; name="userHash"
10-12 14:55:59.775 24479-25505/com.gigrev.gigkev D/OkHttp: Content-Transfer-Encoding: binary
10-12 14:55:59.775 24479-25505/com.gigrev.gigkev D/OkHttp: Content-Type: multipart/form-data; charset=utf-8
10-12 14:55:59.775 24479-25505/com.gigrev.gigkev D/OkHttp: Content-Length: 32
10-12 14:55:59.775 24479-25505/com.gigrev.gigkev D/OkHttp: Content-Disposition: form-data; name="picture"; filename="IMAG0204.jpg"
10-12 14:55:59.775 24479-25505/com.gigrev.gigkev D/OkHttp: Content-Type: multipart/form-data
10-12 14:55:59.775 24479-25505/com.gigrev.gigkev D/OkHttp: Content-Length: 848314

Модифицированная версия:

compile 'com.squareup.retrofit2:retrofit:2.0.1'
    compile 'com.squareup.retrofit2:converter-gson:2.0.1'
person funkycookie    schedule 12.10.2016