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 –
- Retrofit + OkHttp + GZIP-ed JSON
- Cómo realizar una prueba de unidad
- AWS S3 Rest API con Android Retrofit V2 biblioteca, la imagen cargada está dañada
- Cómo cancelar la solicitud con retofit2 y RxAndroid
- Cubriendo json array utilizando retrofit?
@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
- Cómo hacer la solicitud https con certificado SSL en Retrofit
- Error de actualización La cadena de consulta de URL no debe tener el bloque de reemplazo
- Retrofit 2 (en Android) después de la implementación, ¿Dónde están mis elementos JSON?
- Manejo de listas con RxJava y Retrofit en android
- POST con Android Retrofit
- ¡Retrofit! Devolver un tipo genérico observable
- retrofit: trata con la propiedad que puede ser una cadena vacía o una matriz
- Java.lang.NoClassDefFoundError: Resolución fallida de: Lretrofit2 / GsonConverterFactory;
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);
- Cómo ocultar el teclado de Android en la vista de búsqueda
- La vista de desplazamiento no cambia de tamaño cuando el contenido de la vista secundaria cambia