29

私のクライアントのAPIは、オブジェクトを削除するには、コンテンツを説明するJsonヘッダーデータを含むDELETEリクエストを送信する必要があることを指定しています。事実上、これはオブジェクトの追加と同じ呼び出しであり、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();

削除リクエストを送信するために、それに応じてリクエスト方法を「DELETE」に変更しました。ただし、次のエラーが発生します。

java.net.ProtocolException: DELETE does not support writing

だから、私の質問は、Androidからのヘッダーデータを含むDELETEリクエストを送信するにはどうすればよいですか?私は要点を見逃していますか?DELETEリクエストにヘッダーデータを追加できますか?ありがとう。

4

9 に答える 9

32

問題のある行はcon.setDoOutput(true);です。これを削除するとエラーが修正されます。

addRequestPropertyまたはを使用して、リクエストヘッダーをDELETEにsetRequestProperty追加できますが、リクエスト本文を追加することはできません。

于 2013-05-11T12:57:53.217 に答える
7

これは、HttpURLConnection古いAndroidバージョン(<= 4.4)での制限です。

代わりに使用することもできますが、Android 6から削除されHttpClientたいくつかの問題がある古いライブラリであるため、お勧めしません。

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();
}
于 2016-07-11T22:29:51.340 に答える
4

getOutputStream()は、POSTなどの本文を持つリクエストでのみ機能します。DELETEのように本文を持たないリクエストで使用すると、ProtocolExceptionがスローされます。代わりに、getOutputStream()を呼び出す代わりに、addHeader()を使用してヘッダーを追加する必要があります。

于 2012-04-26T17:56:17.757 に答える
4

私は少し遅れていることを知っていますが、誰かが私のようにグーグルで検索してここに落ちたら、私はこのように解決しました:

    conn.setRequestProperty("X-HTTP-Method-Override", "DELETE");
    conn.setRequestMethod("POST");
于 2016-02-27T00:22:09.153 に答える
4

DELETEリクエストはGETリクエストの拡張形式であり、Androidのドキュメントによると、DELETEリクエストの本文に書き込むことはできません。HttpUrlConnectionは、「プロトコル例外を書き込めません」をスローします。

それでも本文にパラメータを記述したい場合は、OKHttpライブラリを使用することをお勧めします。

OKHttpドキュメント

より単純なライブラリを使用することに興味がある場合は、SimpleHttpAndroid ライブラリを試すことができます

ここで覚えておくべきことの1つは、本文に何も書き込んでいない場合は、行を削除することです。

conn.setDoOutput(true);

ありがとう、うまくいけばそれが役立つかもしれません。

于 2017-07-10T10:43:21.977 に答える
2

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();
        }
于 2015-05-13T08:18:10.867 に答える
0

あなたはただaddHeader()方法を使うことができないのですか?

于 2012-04-26T17:47:53.703 に答える
0

これが私の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();
        }
    }

}

お役に立てば幸いです。

于 2016-09-05T20:52:23.137 に答える
-7

この質問にクロージャーを追加するために、ヘッダーデータを含むHTTPDELETEリクエストを送信するためのサポートされているメソッドがないことが判明しました。

解決策は、クライアントがAPIを変更して、削除するアイテムのIDを含むアクションを削除する必要があることを示す標準のGETリクエストを受け入れるようにすることでした。

http://clienturl.net/api/delete/id12345
于 2013-01-26T12:16:55.420 に答える