Retrofit - @Body parameters cannot be used with form or multi-part encoding

前端 未结 5 1342
时光说笑
时光说笑 2020-12-24 05:10

I m trying to make a request in which I want to include a Header , a form-urlencoded field and a json body. My Retrofit interface is as follows

@FormUrlEnc         


        
相关标签:
5条回答
  • 2020-12-24 05:20

    Send Authentication header with json Body to API sample code in Kotlin :

     @POST("/api/user/sendlist/")
        fun callSendJsonListPost(
                          @Header("Authheader") header: String,
                          @Body list: StringBuilder
                          )
            : Observable<EntityModelUserslist>
    
    0 讨论(0)
  • 2020-12-24 05:24

    I solved this problem by adding the field into

    @POST("/api/register") 
    

    like this:

    @POST("/api/register?grantType=value")
    

    it's not a good solution, but may be useful.

    0 讨论(0)
  • 2020-12-24 05:29

    Adding to Julien's answer, also remove the @Multipart annotation. Here's how I have used it:

    @POST("/app/oauth/token")
    Call<AuthResponse> getAuthToken(@Body RequestBody body);
    

    And, here is how I have constructed the RequestBody:

    RequestBody requestBody = new MultipartBody.Builder()
                            .setType(MultipartBody.FORM)
                            .addFormDataPart("grant_type", "password")
                            .addFormDataPart("username", username)
                            .addFormDataPart("password", password)
                            .build();
    
    0 讨论(0)
  • 2020-12-24 05:41

    This post pointed me to the right direction https://stackoverflow.com/a/21423093/1446856. I attached everything in the body and send it as a TypedInput.
    So the interface looks something like this

    @POST("/api/register")
    @Headers({ "Content-Type: application/json;charset=UTF-8"})
    Observable<RegisterResponse> register(
        @Header("Authorization") String authorization,
        @Body TypedInput body
    );
    

    and the body looks something like this

    String bodyString = jsonBody + "?grant_type=" + 
        grantType + "&scope=" + scope;
    TypedInput requestBody = new TypedByteArray(
        "application/json", bodyString.getBytes(Charset.forName("UTF-8")));
    
    0 讨论(0)
  • 2020-12-24 05:45

    maybe this could help some people, if you have this trouble, you should remove @FormUrlEncoded of your interface. Hope this helps.

    0 讨论(0)
提交回复
热议问题