一般使用 Jersey 或 RESTEasy 所建立的 JAX-RS Web Service,是允許 client 呼叫 DELETE method 時可以加上 Message Body,就跟 POST method 一樣我們可以取得 Body 裡的內容。
但 Client 如果是使用 Retrofit 來呼叫 Web Service 的 DELETE method 並且加上 Body annotation 夾帶資料過去時,卻會得到如下的訊息而被中止︰
Non-body HTTP method cannot contain @Body or @TypedOutput.
對 Retrofit 來說是照著 W3C 的標準去實作,於是這樣的行為就跟一般坊間的 http client 不太一樣。
最快的方法就是自定一個可以允許夾帶資料的 DELETE Annotation,讓 Retrofit 可以參照︰
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import retrofit.http.RestMethod;
@Target(METHOD)
@Retention(RUNTIME)
@RestMethod(value = “DELETE”, hasBody = true)
public @interface DELETE {
String value();
}
然後在自己的 Retrofit Service 使用這個 DELETE annotation 就可以了︰
@DELETE("/remove")
public OutputJson deleteFormType(@Body FormType form_type);
搞定收工。