Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send a JSONObject into a Retrofit API call Android

I have implemented the first time Retrofit in my Android code and am facing the following issues:

java.lang.IllegalArgumentException: @Body parameters cannot be used with form or multi-part encoding. (parameter #1)

I have implemented my code like below:

public interface APIService {
    @FormUrlEncoded
    @POST("/")
    @Headers({
        "domecode: axys",
        "Content-Type: application/json;charset=UTF-8"
    })
    Call<JsonObject> sendLocation(@Body JsonObject jsonObject);
}


public class ApiUtils {

    static String tempUrl = "http://192.168.16.114:8092/api/v1/location/tsa/";
    public static APIService getAPIService() {

        return RetrofitClient.getClient(tempUrl).create(APIService.class);
    }
}

public class RetrofitClient {

    private static Retrofit retrofit = null;

    public static Retrofit getClient(String baseUrl) {
        if(retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }

}

Passing the value to an API call

JsonObject postParam = new JsonObject();
try {
    postParam.addProperty(Fields.ID, "asdf");
}

Call<JsonObject> call = apiService.sendLocation(postParam);
call.enqueue(
    new Callback<JsonObject>() {
        @Override
        public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
            Log.d("response", "Getting response from server: " + response);
        }

        @Override
        public void onFailure(Call<JsonObject> call, Throwable t) {
            Log.d("response", "Getting response from server: " + t);
        }
    }
);
like image 879
user1742971 Avatar asked Mar 01 '17 10:03

user1742971


1 Answers

You are using the Android internal JSON APIs. You need to use Gson's classes instead.

Call<JsonObject> sendLocation(@Body JsonObject jsonObject);

Hence the import statement

import com.google.gson.JsonObject;

Another error is passing the Callback as a parameter to the request

Call<JsonObject> call = apiService.sendLocation(jsonObject);
call.enqueue(new Callback<JsonObject>() {
   @Override
   public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
      Log.d("response", "Getting response from server: "+response);
   }

   @Override
   public void onFailure(Call<JsonObject> call, Throwable t) {
      Log.d("response", "Getting response from server: " + t);
   }
});
like image 154
Ahmed Hegazy Avatar answered Sep 22 '22 15:09

Ahmed Hegazy