retrofit - sistema - Los métodos de servicio no pueden regresar vacíos. retroadaptación
requisitos funcionales y no funcionales (4)
Este es mi método en Interface. Llamo a esta función, pero falla la aplicación con esta excepción:
Causado por: java.lang.IllegalArgumentException: los métodos de servicio no pueden regresar vacíos. para el método 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);
Y este es el código donde llamo a esta función
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) {
}
});
Hay diferencia en Asynchronous en Retrofit 1.9 y 2.0
/ * Sincrónico en Retrofit 1.9 * /
public interface APIService {
@POST("/list")
Repo loadRepo();
}
/ * Asincrónico en Retrofit 1.9 * /
public interface APIService {
@POST("/list")
void loadRepo(Callback<Repo> cb);
}
Pero en Retrofit 2.0, es mucho más simple ya que puedes declarar con un solo patrón
/* Retrofit 2.0 */
public interface APIService {
@POST("/list")
Call<Repo> loadRepo();
}
// Llamada síncrona en Retrofit 2.0
Call<Repo> call = service.loadRepo();
Repo repo = call.execute();
// Llamada asincrónica en 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);
}
});
Según tus clases, parece que estás usando Retrofit 2.0.0, que actualmente está en beta. Creo que usar un vacío en su método de servicio ya no está permitido. En su lugar, devuelva Call , que puede poner en cola para realizar la llamada de red de forma asincrónica.
Alternativamente, deje caer su biblioteca hacia Retrofit 1.9.0 y reemplace su clase de Retrofit con RestAdapter.
Siempre puedes hacer:
@POST("/endpoint")
Call<Void> postSomething();
EDITAR:
Si está usando RxJava, desde 1.1.1 puede usar la clase Completable .
https://github.com/square/retrofit/issues/297
Por favor ve a través de este enlace.
" Se requerirá que todas las declaraciones de interfaz devuelvan un objeto a través del cual se producirá toda la interacción. El comportamiento de este objeto será similar a un futuro y será de tipo genérico (T) para el tipo de respuesta exitosa " .
@GET("/foo")
Call<Foo> getFoo();
Basado en la nueva versión Retrofit 2.0.0 beta No puede especificar el tipo de devolución como nulo para que sea asincrónico
según el código dentro de la modificación ( https://github.com/square/retrofit/blob/master/retrofit/src/main/java/retrofit/MethodHandler.java ) mostrará una excepción cuando intente la implementación anterior con 2.0. 0 beta
if (returnType == void.class) {
throw Utils.methodError(method, "Service methods cannot return void.");
}