Retrofit 2 Multipart POST request sends extra quotes to PHP

后端 未结 4 1798
广开言路
广开言路 2021-02-05 17:08

Using Retrofit 2.0.1, there is a call function in my API interface defined in Android App:

@Multipart
@POST(\"api.php\")
Call doAPI(
  @Part(         


        
相关标签:
4条回答
  • 2021-02-05 17:25

    If you would rather not use a converter, here's what I did to send a multipart request containing an image file, and 2 strings:

    @Multipart
    @POST("$ID_CHECK_URL/document")
    fun postMultipart(@Part imageFile: MultipartBody.Part, @Part string2:  MultipartBody.Part, @Part string2:  MultipartBody.Part)
    

    And calling it this way:

        val body = RequestBody.create(MediaType.parse("image/jpg"), file)
        val imageFilePart = MultipartBody.Part.createFormData("file", file.name, reqFile)
    
        val string1Part = MultipartBody.Part.createFormData("something", "string 1")
    
        val string2Part = MultipartBody.Part.createFormData("somethingelse", "string 2")
    
        service.postDocument(imageFilePart, string1Part, string2Part)
    
    0 讨论(0)
  • 2021-02-05 17:34

    For your issue, please use as the documentation

    Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

    So, add compile 'com.squareup.retrofit2:converter-scalars:2.0.1' into build.gradle file

    Then...

    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(API_URL_BASE)
        .addConverterFactory(ScalarsConverterFactory.create())
        //.addConverterFactory(GsonConverterFactory.create())
        .build();
    

    Hope it helps!

    0 讨论(0)
  • 2021-02-05 17:37

    I faced this on my project today and this is how I solved it. I changed @Part on my string and other primitive values to @Query, and for file (in my case image) i used @Part. Looks like @Query treats strings in a different way compared to @Part.

    So my answer to original question would look like this:

    @Multipart
    @POST("api.php")
    Call<ResponseBody> doAPI(
      @Query("lang") String lang,
      @Part("file\"; filename=\"image.jpg") RequestBody file
    );
    

    This should send string values without unwanted quotes. Sadly, I cant explain why this works, it has something to do with @Part encoding of data.

    0 讨论(0)
  • 2021-02-05 17:41

    Use RequestBody for all your parameters. Please go through below code!!

    File file = new File(imagePath);
    RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
    MultipartBody.Part imageFileBody = MultipartBody.Part.createFormData("media", file.getName(), requestBody);
    RequestBody id = RequestBody.create(MediaType.parse("text/plain"),addOfferRequest.getCar_id());
    ApiCallback.MyCall<BaseResponse> myCall = apiRequest.editOfferImage(imageFileBody,id);
    

    Use RequestBody class of Retrofit instead of String

    @Multipart
    @POST(ApiURL)
    ApiCallback.MyCall<BaseResponse> editOfferImage(@Part MultipartBody.Part imageFile,@Part("id") RequestBody id);
    
    0 讨论(0)
提交回复
热议问题