2016-06-27 10 views
1

この問題に数時間苦労した後、私は最後にここでアドバイスを求めることにしました。 私は、アプリケーションでネットワーキングにRetrofit 2を使用します。OkhttpでMultipartBody.PartのContent-Typeを設定できません

@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); 

広告これは、私はそれを呼び出す方法です::画像をアップロードするためのAPIインタフェースでの私の方法はどのように見えるかです

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) { 

     } 
    }); 

私の問題は、私は、サーバーからのエラーメッセージが出ていていることであるのため、不正なボディパラメータ。あなたはフィドラーから画面から見ることができるように、各パートのためのいくつかのresonのContent-Typeのは、「アプリケーション/ JSON」に設定されている場合: Request body parameters

私の問題に関連するだけの議論を私は見つけることALBEたMultipart request overriding content-type not working #1433

です

しかし、それはボディ部分ではなく、リクエストヘッダのコンテンツタイプに関するものです。 誰かがOkHttpに似た問題に直面したのかもしれません。なぜなら、この特定の要求に対してこのライブラリから切り換えてexcetpを問題解決できるものがないからです。

答えて

0

現在、同じ問題が発生しています。文字列と画像を送信しようとしているので、両方とも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を受け入れない、私はそれを私の側で把握しなければならない。あなたは解決策を見つけることができましたか?

EDIT:実際には解決策が見つかりました。ただ、改造版を更新し、これは私が今ログに取得されるものです:

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' 
関連する問題