Search code examples
retrofit

Service methods cannot return void. retrofit


This is my method in Interface. I am calling this function but app crash with this exception:

Caused by: java.lang.IllegalArgumentException: Service methods cannot return void. for method RestInterface.getOtp

//post method to get otp for login
@FormUrlEncoded
@POST("/store_login")
void getOtp(@Header("YOUR_APIKEY") String apikey, @Header("YOUR_VERSION") String appversion,
            @Header("YOUR_VERSION") String confiver, @Field("mobile") String number, Callback<Model> cb);

And this is the code where I am calling this function

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(API_URL)
            .build();

    RestInterface restApi = retrofit.create(RestInterface.class);
    restApi.getOtp("andapikey", "1.0", "1.0", "45545845454", new Callback<Model>() {

        @Override
        public void onResponse(Response<Model> response) {

        }

        @Override
        public void onFailure(Throwable t) {

        }
    });

Solution

  • There is difference in Asynchronous in Retrofit 1.9 and 2.0

    /* Synchronous in Retrofit 1.9 */

    public interface APIService {
    
    @POST("/list")
    Repo loadRepo();
    
    }
    

    /* Asynchronous in Retrofit 1.9 */

    public interface APIService {
    
    @POST("/list")
    void loadRepo(Callback<Repo> cb);
    
    }
    

    But on Retrofit 2.0, it is far more simple since you can declare with only just a single pattern

    /* Retrofit 2.0 */
    
    public interface APIService {
    
    @POST("/list")
    Call<Repo> loadRepo();
    
    }
    

    // Synchronous Call in Retrofit 2.0

    Call<Repo> call = service.loadRepo();
    Repo repo = call.execute();
    

    // Asynchronous Call in Retrofit 2.0

    Call<Repo> call = service.loadRepo();
    call.enqueue(new Callback<Repo>() {
    @Override
    public void onResponse(Response<Repo> response) {
    
       Log.d("CallBack", " response is " + response);
    }
    
    @Override
    public void onFailure(Throwable t) {
    
      Log.d("CallBack", " Throwable is " +t);
    }
    });