Retrofit que lanza IllegalArgumentException exception for asynchronous FormUrlEncoded DELETE call

Estoy tratando de hacer un asincrónico POST y DELETE que es url de formulario codificado utilizando Retrofit en Android 4.4

Aquí está mi cliente –

@FormUrlEncoded @POST(INetwork.API_BASE_PREFIX + "/memberships.json") void join(@Field("id") String id, Callback<?> cb); @FormUrlEncoded @DELETE(INetwork.API_BASE_PREFIX + "/memberships.json") void leave(@Field("id") String id, Callback<?> cb); 

Y esta es la excepción –

 java.lang.IllegalArgumentException: IRepositoryClient.leave: FormUrlEncoded can only be specified on HTTP methods with request body (eg, @POST). at retrofit.RestMethodInfo.methodError(RestMethodInfo.java:118) at retrofit.RestMethodInfo.parseMethodAnnotations(RestMethodInfo.java:191) at retrofit.RestMethodInfo.init(RestMethodInfo.java:128) at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:329) at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:264) at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:315) at retrofit.CallbackRunnable.run(CallbackRunnable.java:42) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) at retrofit.Platform$Android$2$1.run(Platform.java:142) at java.lang.Thread.run(Thread.java:841) 

Miré a través de la fuente y básicamente si el método no tiene un cuerpo y la solicitud es formurlencoded, esta excepción se lanza. También me di cuenta de que todo el ejemplo de FormUrlEncoded funciona bien cuando no es asíncrono, es decir, tengo un tipo de retorno de algún tipo y no callback – lo siento estoy un poco perdido

¿Debo enviar un cuerpo vacío? ¿Tengo que enviar uno y los parámetros @Field no bastarán?

Uso de Retrofit 1.5.0

El RFC para HTTP no está claro si o no el método DELETE se permite tener un cuerpo de solicitud o no. Retrofit está planteando un error en el lado de la precaución por no tener uno.

Sin embargo, todavía puede incluir uno (suponiendo que el cliente HTTP lo admite) mediante una anotación de método HTTP personalizada.

 package com.myapp; @Target(METHOD) @Retention(RUNTIME) @RestMethod(value = "DELETE", hasBody = true) public @interface BODY_DELETE { String value(); } 

Ahora especifique su método de interfaz utilizando la anotación personalizada que ha definido.

 @FormUrlEncoded @BODY_DELETE(INetwork.API_BASE_PREFIX + "/memberships.json") void leave(@Field("id") String id, Callback<?> cb); 

Respuesta actualizada para Retrofit 2.0:

Retrofit 2 no parece tener @RestMethod más, por lo que aquí es lo que funciona:

 @FormUrlEncoded @HTTP(method = "DELETE", path = INetwork.API_BASE_PREFIX + "/memberships.json", hasBody = true) void leave(@Field("id") String id, Callback<?> cb); 

Para retrofit 2. +

 @FormUrlEncoded @HTTP(method = "DELETE", path = INetwork.API_BASE_PREFIX + "/memberships.json", hasBody = true) Callback<?> cb(@Field("id") String id); 

Y para RxRetrofit 2. +

 @FormUrlEncoded @HTTP(method = "DELETE", path = INetwork.API_BASE_PREFIX + "/memberships.json", hasBody = true) Observable<?> cb(@Field("id") String id); 
  • ProGuard no funciona con okhttp
  • Cómo emitir elementos de una lista con retraso en RxJava?
  • Retrofit 2: Obtener el cuerpo de JSON from Response
  • Descargar vídeo de Url con Retrofit
  • Vimeo error de SSL con Retrofit en Android
  • Android - Configuración de Retrofit / Apache HttpClient para Digest Auth
  • Deserialización GSON de una lista envuelta de objetos
  • ¿Cómo usar Retrofit y SimpleXML juntos para descargar y analizar un archivo XML de un sitio?
  • No se puede verificar la llamada de método de simulación desde el suscriptor de RxJava
  • Convertidor de gson retrofit para json anidado con diferentes objetos
  • ¿Cuándo se debe usar RxJava Observable y cuándo Callback simple en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.