web-dev-qa-db-ja.com

System.Net.Httpを使用してDeleteWebAPIメソッドを呼び出すときに本文のコンテンツを渡す

次のように構築されたWebAPIDeleteメソッドを呼び出す必要があるシナリオがあります。

// DELETE: api/products/{id}/headers
[HttpDelete("{id}/headers")]
public void DeleteProductHeaders(int id, [FromBody] string query)
{
}

秘訣は、クエリを取得するために本文を介して送信する必要があり、DeleteAsyncにはpostのようにjsonのパラメーターがないことです。 C#でSystem.Net.Httpクライアントを使用してこれを行う方法を知っている人はいますか?

// Delete a product's headers
public void DeleteProductHeaders(int id, string query)
{
    using (var client = GetClient())
    {
        HttpResponseMessage response;
        try
        {
            // HTTP DELETE
            response = client.DeleteAsync($"api/products/{id}/headers").Result;
        }
        catch (Exception ex)
        {
            throw new Exception("Unable to connect to the server", ex);
        }
    }
    return retVal;
}
7
Blake Rivell

これが私がそれを達成した方法です

var request = new HttpRequestMessage(HttpMethod.Delete, "http://www.example.com/");
request.Content = new StringContent(JsonConvert.SerializeObject(object), Encoding.UTF8, "application/json");
await this.client.SendAsync(request);
19
Ben Anderson

HttpClientがそのように設計されている理由は、HTTP 1.1仕様ではメッセージ本文が [〜#〜] delete [〜#〜] リクエストで許可されているにもかかわらず、仕様のように基本的にそうすることは期待されていないためだと思います。定義されているとおりにセマンティクスを定義しないでください ここ 。 HttpClientはHTTP仕様に厳密に従っているため、リクエストにメッセージ本文を追加することはできません。

したがって、クライアント側からのオプションには、 ここ で説明されているHttpRequestMessageの使用が含まれていると思います。バックエンドから修正したい場合で、メッセージ本文がクエリパラメータで適切に機能する場合は、メッセージ本文でクエリを送信する代わりに、それを試すことができます。

個人的には、DELETEにメッセージ本文を含めることを許可する必要があり、サーバーでは無視しないでください。ここで説明したようなユースケースは確かにあります。

いずれにせよ、これに関するより生産的な議論については、 this をご覧ください。

2
Swagata Prateek

以下の私のAPI:

// DELETE api/values
public void Delete([FromBody]string value)
{
}

C#サーバー側からの呼び出し

            string URL = "http://localhost:xxxxx/api/values";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
            request.Method = "DELETE";
            request.ContentType = "application/json";
            string data = Newtonsoft.Json.JsonConvert.SerializeObject("your body parameter value");
            request.ContentLength = data.Length;
            StreamWriter requestWriter = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
            requestWriter.Write(data);
            requestWriter.Close();

            try
            {
                WebResponse webResponse = request.GetResponse();
                Stream webStream = webResponse.GetResponseStream();
                StreamReader responseReader = new StreamReader(webStream);
                string response = responseReader.ReadToEnd();

                responseReader.Close();
            }
            catch
            {

            }
1
nativegrip