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); 
  • Subir varias imágenes al servidor en una cola
  • Solicitud por lotes utilizando Retrofit
  • ¿Cómo manejar parámetros que pueden ser ARRAY u OBJECT en Retrofit en Android?
  • Retrofit POST con un objeto json que contiene parámetros
  • Retrofit, devolución de llamada para 204 No respuesta de contenido?
  • Subir una imagen a Google appengine utilizando Robospice con Retrofit
  • Retrofit ETAG y almacenamiento en caché
  • Solo observable con varios suscriptores
  • Manera correcta de manejar ninguna red con Retrofit y RX-java
  • Cómo utilizar OAuth 2.0 con Retrofit Android
  • Consulta GET con json - Retrofit 2.0
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.