Retrofit 2 with only form-data

Here's another Solution using the request body form-data in Kotlin. This solution work for me in Kotlin.

val request = ServiceBuilder.buildService(TmdbEndpoints::class.java)
val requestBody: RequestBody = MultipartBody.Builder()
      .setType(MultipartBody.FORM)
      .addFormDataPart("email", "[email protected]")
      .addFormDataPart("password", "admin")
      .addFormDataPart("push_token", "token")
      .addFormDataPart("device_id", "1112222")
      .addFormDataPart("platform", "android")
      .addFormDataPart("device_name", "my device")
      .addFormDataPart("version", "1.2")
      .build()
            
val call = request.userFigLogin(requestBody)

call.enqueue(object : Callback<LoginResult> {
     override fun onFailure(call: Call<LoginResult>, t: Throwable) { }

     override fun onResponse(call: Call<LoginResult>,
          response: retrofit2.Response<LoginResult>) { }
})

You should use RequestBody type for your parameter like this.

@POST("api/login")
fun userFigLogin(@Body body: RequestBody): Call<LoginResult>

In retrofit 2.0 to perform POST request like above, you should use RequestBody type for your parameter like this.

@Multipart
@POST("XXXX")
Call<PlanResponse> myPlans(@Part(Constants.ACTION_ID) RequestBody actionId, @Part(Constants.OFFER_CODE) RequestBody offerCode);

And here how to get requestBody from String.

String somevalue = "somevalue";
RequestBody body = RequestBody.create(MediaType.parse("text/plain"), somevalue);

I wanted to pass an array of ids to an existing request.

I tried several variants from here, Retrofit - Send request body as array or number, How to send PUT request with retrofit string and array list of model I need to use URL encoded, but they didn't work. Then I tried android retrofit send array as x-www-form-urlencoded.

I added [] to a list parameter and List to it's type:

@FormUrlEncoded
@POST("your_request/")
fun sendIds(
    @Field("token") token: String,
    @Field("city_id") cityId: Int?,
    @Field("description") description: String,
    @Field("ids[]") ids: List<Int>? // Add '[]' here.
): Deferred<YourResponse>

Then called it as usual (with Kotlin coroutines):

api.sendIds("f0123abc", null, "description", listOf(1, 2, 3)).await()

See also Is it possible to send an array with the Postman Chrome extension? to understand how it looks like in Postman.


Here's another Solution using request body:

RequestBody requestBody = new MultipartBody.Builder()
        .setType(MultipartBody.FORM)
        .addFormDataPart("param1", param1)
        .addFormDataPart("param2", param2)
        .build();

apiInterface.somePostMethod(requestBody).enqueue(
    //onResponse onFailure methods
);

here's my api inteface POST method

@POST("somePostMethod")
Call<ResponseBody> somePostMethod(@Body RequestBody body);

Hope it helps.