在Android中发送HTTP DELETE请求

and*_*eil 25 android httpwebrequest

我的客户端API指定要删除对象,必须发送DELETE请求,其中包含描述内容的Json头数据.实际上它与添加对象的调用相同,这是通过POST完成的.这工作正常,我的代码的内容如下:

HttpURLConnection con = (HttpURLConnection)myurl.openConnection();
con.setRequestMethod("POST");
con.setDoOutput(true);
con.setUseCaches(false);
con.connect();
OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream());
wr.write(data); // data is the post data to send
wr.flush();
Run Code Online (Sandbox Code Playgroud)

要发送删除请求,我将请求方法更改为"DELETE".但是我收到以下错误:

java.net.ProtocolException: DELETE does not support writing
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是,如何从Android发送包含标题数据的DELETE请求?我错过了这一点 - 您是否能够将标题数据添加到DELETE请求中?谢谢.

Tal*_*tle 31

有问题的路线是con.setDoOutput(true);.删除它将修复错误.

您可以使用addRequestProperty或向DELETE添加请求标头setRequestProperty,但不能添加请求正文.

  • 如果我需要用DELETE发送一些json怎么办? (2认同)

Mur*_*phy 6

这是HttpURLConnection, 在旧 Android 版本 (<=4.4) 上的限制。

虽然您也可以使用HttpClient,但我不推荐它,因为它是一个旧库,有几个问题已从 Android 6删除

我建议使用最近的新库,如OkHttp

OkHttpClient client = new OkHttpClient();
Request.Builder builder = new Request.Builder()
    .url(getYourURL())
    .delete(RequestBody.create(
        MediaType.parse("application/json; charset=utf-8"), getYourJSONBody()));

Request request = builder.build();

try {
    Response response = client.newCall(request).execute();
    String string = response.body().string();
    // TODO use your response
} catch (IOException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)