0

I am using the retrofit library for API call and I want to send the parameter to my server using the "form-data" method. I found this question on StackOverflow, but there is no solution yet. Please guide me and let me know if I can provide more details for the same. Thank you

user9088454
  • 1,076
  • 1
  • 15
  • 45
Dnyanesh M
  • 1,349
  • 4
  • 18
  • 46

3 Answers3

2

Why don't you use Multipart? This is an example of using it for a simple user info with phone number, password and a prfile pic:

In your Activity:

final RequestBody rPhoneNumber = RequestBody.create(MediaType.parse("text/plain"), "sample phone number");
final RequestBody rPassword = RequestBody.create(MediaType.parse("text/plain"), "sample phone password");
final MultipartBody.Part rProfilePicture = null;
Retrofit.Builder builder = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(baseUrl).client(Cookie.cookie.build());
Retrofit retrofit = builder.build();
final RequestHandler requestHandler = retrofit.create(RequestHandler.class);
rProfilePicture = MultipartBody.Part.createFormData("file", file.getName(), RequestBody.create(MediaType.parse("image/*"),file)); //sample image file that you want to upload
Call<ServerMessage> call; //ServerMessage is a class with a String to store and convert json response
call = requestHandler.editProfile(rPhoneNumber, rPassword, rProfilePicture); //editProfile is in RequestHandler interface
call.enqueue(new Callback<ServerMessage>() {
    @Override
    public void onResponse (Call < ServerMessage > call2, Response < ServerMessage > response){
        //your code here
    }

    @Override
    public void onFailure (Call < ServerMessage > call, Throwable t) {
        //your code here
    }
});

In RequestHandler.java interface:

    @Multipart
@POST("/api/change-profile")
Call<ServerMessage> editProfile(@Part("phoneNumber") RequestBody rPhoneNumber,
                                @Part("oldPassword") RequestBody rPassword,
                                @Part MultipartBody.Part rProfilePicture);

In ServerMessage.java:

public class ServerMessage {
private String message;

public String getMessage() {
    return message;
}
}
Parham
  • 116
  • 10
1

This sample should help:

 public interface AuthService {

    @POST("register")
    @Headers("Content-Type:application/x-www-form-urlencoded")
    @FormUrlEncoded
    Call<LoginResponse> loginSocial(@Field("provider") String provider, @Field("access_token") String accessToken }
bijaykumarpun
  • 677
  • 4
  • 9
  • 1
    Thanks for the reply. I tried this solution, but parameters are not getting delivered to the back-end server. It is working on Postman – Dnyanesh M Aug 05 '19 at 08:11
1

I know this might be late. I came this same challenge and this is what works for me

val requestBody: RequestBody = MultipartBody.Builder()
                        .setType(MultipartBody.FORM)
                        .addFormDataPart("avatar", imageFile.toString())
                        .build()

  @POST("avatar")
    fun uploadProfilePicture(
        @Header("Authorization") header: String?,
        @Body avatar:RequestBody
    ): Call<UserResponse>

Darotudeen
  • 1,914
  • 4
  • 21
  • 36