发送HTTP DELETE Android中请求(Sending HTTP DELETE reque

2019-06-24 00:24发布

我的客户的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();

要发送删除请求,我改变了请求方法来“删除”相应。 不过,我得到以下错误:

java.net.ProtocolException: DELETE does not support writing

所以,我的问题是,我怎么送于Android包含头数据的DELETE请求? 我缺少一点 - 你能报头数据添加到一个DELETE请求? 谢谢。

Answer 1:

有问题的行是con.setDoOutput(true); 。 卸下,将修正这个错误。

您可以添加请求头到DELETE,使用addRequestPropertysetRequestProperty ,但你不能添加请求主体。



Answer 2:

的getOutputStream()只适用于有一个机构,比如POST请求。 在不具有主体,如删除,将抛出的ProtocolException请求使用它。 相反,你应该用的addHeader()而不是调用的getOutputStream()添加标题。



Answer 3:

我知道是有点晚了,但如果有人在这里落下像我这样的搜索在谷歌我解决了这个办法:

    conn.setRequestProperty("X-HTTP-Method-Override", "DELETE");
    conn.setRequestMethod("POST");


Answer 4:

这是的限制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();
}


Answer 5:

尝试下面呼叫HttpDelete方法方法,它为我工作,希望能为您的工作,以及

String callHttpDelete(String url){

             try {
                    HttpParams httpParams = new BasicHttpParams();
                    HttpConnectionParams.setConnectionTimeout(httpParams, 15000);
                    HttpConnectionParams.setSoTimeout(httpParams, 15000);

                    //HttpClient httpClient = getNewHttpClient();
                    HttpClient httpClient = new DefaultHttpClient();// httpParams);


                    HttpResponse response = null;    
                    HttpDelete httpDelete = new HttpDelete(url);    
                    response = httpClient.execute(httpDelete); 

                    String sResponse;

                    StringBuilder s = new StringBuilder();

                    while ((sResponse = reader.readLine()) != null) {
                        s = s.append(sResponse);
                    }

                    Log.v(tag, "Yo! Response recvd ["+s.toString()+"]");
                    return s.toString();
                } catch (Exception e){
                    e.printStackTrace();
                }
              return s.toString();
        }


Answer 6:

DELETE请求是GET请求的扩展形式,按与Android文档,你不能在DELETE请求的身体书写。 HttpURLConnection类将引发“ 无法写入协议异常 ”。

如果你还是要写在体内的参数,我建议你使用OKHttp库。

OKHttp文档

如果你是intrested使用更简单的库,那么你可以尝试SimpleHttpAndroid库

这里有一点要记住的是,如果你不能在体内写任何东西,然后删除行

conn.setDoOutput(true);

谢谢,希望它可以帮助。



Answer 7:

你不能只是使用addHeader()方法?



Answer 8:

这里是我的Delete请求方法。

只要它是post有额外的要求RequestProperty

connection.setRequestProperty("X-HTTP-Method-Override", "DELETE");

下面的完整方法。

    public void executeDeleteRequest(String stringUrl, JSONObject jsonObject, String reqContentType, String resContentType, int timeout) throws Exception {
    URL url = new URL(stringUrl);
    HttpURLConnection connection = null;
    String urlParameters = jsonObject.toString();
    try {
        connection = (HttpURLConnection) url.openConnection();

        //Setting the request properties and header
        connection.setRequestProperty("X-HTTP-Method-Override", "DELETE");
        connection.setRequestMethod("POST");
        connection.setRequestProperty("User-Agent", USER_AGENT);
        connection.setRequestProperty(CONTENT_TYPE_KEY, reqContentType);
        connection.setRequestProperty(ACCEPT_KEY, resContentType);


        connection.setReadTimeout(timeout);
        connection.setConnectTimeout(defaultTimeOut);

        connection.setUseCaches(false);
        connection.setDoInput(true);
        connection.setDoOutput(true);

        // Send request
        DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
        wr.writeBytes(urlParameters);
        wr.flush();
        wr.close();
        responseCode = connection.getResponseCode();
        // To handle web services which server responds with response code
        // only
        try {
            response = convertStreamToString(connection.getInputStream());
        } catch (Exception e) {
            Log.e(Log.TAG_REST_CLIENT, "Cannot convert the input stream to string for the url= " + stringUrl + ", Code response=" + responseCode + "for the JsonObject: " + jsonObject.toString(), context);
        }
    } catch (
            Exception e
            )

    {
        if (!BController.isInternetAvailable(context)) {
            IntentSender.getInstance().sendIntent(context, Constants.BC_NO_INTERNET_CONNECTION);
            Log.e(Log.TAG_REST_CLIENT, "No internet connection", context);
        }
        Log.e(Log.TAG_REST_CLIENT, "Cannot perform the POST request successfully for the following URL: " + stringUrl + ", Code response=" + responseCode + "for the JsonObject: " + jsonObject.toString(), context);
        throw e;
    } finally{

        if (connection != null) {
            connection.disconnect();
        }
    }

}

我希望它帮助。



Answer 9:

要添加到闭合这个问题,人们得知有发送HTTP DELETE含有请求报头数据中没有支持的方法。

该解决方案是为客户改变他们的API来接受这表明动作要删除,包含该项目的id要删除一个标准的GET请求。

http://clienturl.net/api/delete/id12345


文章来源: Sending HTTP DELETE request in Android