2017-01-06 4 views
6

Когда я пытаюсь создать метод удаления:Как отправить HTTP-delete с телом в модификации?

public interface ImageService { 
    @DELETE("api/v1/attachment") 
    Call<BaseResponse> delete(@Body DeleteModel deleteModel); 
} 

я получаю ошибку, которая в основном сводится к этим линиям от StackTrace:

E/AndroidRuntime: FATAL EXCEPTION: main 
java.lang.RuntimeException: Failure delivering result 
java.lang.IllegalArgumentException: Non-body HTTP method cannot contain @Body. 
Caused by: java.lang.IllegalArgumentException: Non-body HTTP method cannot contain @Body. 

Как я могу добавить тело в метод удаления ?

Я искал здесь, но нашел 3 ответа и ничего не использовал для модификации.

ответ

16

Более упрощенный ответ.

@FormUrlEncoded 
@HTTP(method = "DELETE", path = "/api/analysis_delete", hasBody = true) 
Call<Analysis_Delete_RequestResult_Api10> analysis_delete_api10(@Field("seq") String seq); 

Это сделает трюк.

+0

Он будет работать на методы PUT с телом, а также. – March3April4

+2

Если вам нужно отправить @ Body, вам нужно удалить @ FormUrlEncoded. – sunlover3

0

служба:

public interface ImageService { 
    @Post("api/v1/attachment") 
    Call<BaseResponse> delete(@Body DeleteModel deleteModel); 
} 

и в servercontroller

import okhttp3.Request; 

private final class ApiInterceptor implements Interceptor { 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request oldRequest = chain.request(); 
     Request.Builder builder = oldRequest.newBuilder(); 
     if(condition) { 
      return chain.proceed(builder.build().newBuilder().delete(builder.build().body()).build()); 
     } 
     return chain.proceed(builder.build()); 
    } 
} 

вы должны вызвать состояние, через что-то и, возможно, придется сделать некоторую фильтрацию для URL/заголовка/тела с целью удалени триггер,

, если удаленный url/body/header не является уникальным, чтобы не столкнуться с сообщением или получить запросы.

1

Вот моя версия

@HTTP(method = "DELETE", path = "{login}", hasBody = true) 
Call<ResponseBody> getData(@Path("login") String postfix, @Body Map<String, Object> options);