web-dev-qa-db-fra.com

Passage du contenu du corps lors de l'appel d'une méthode Delete Web API à l'aide de System.Net.Http

J'ai un scénario dans lequel j'ai besoin d'appeler ma méthode de suppression d'API Web construite comme suit:

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

Le truc, c'est que pour obtenir la requête, j'ai besoin de l'envoyer à travers le corps et DeleteAsync n'a pas de paramètre pour json comme le fait la poste. Est-ce que quelqu'un sait comment je peux faire cela en utilisant le client System.Net.Http en c #?

// 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

Voici comment je l'ai accompli

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);
12
Ben Anderson

Je pense que la raison pour laquelle HttpClient est conçu de cette manière est que, bien que la spécification HTTP 1.1 autorise le corps du message sur DELETE request, elle n'est essentiellement pas censée le faire, car la spécification ne définit aucune sémantique comme elle est définie. ici . HttpClient suit strictement les spécifications HTTP, vous voyez donc qu'il ne vous permet pas d'ajouter un corps de message à la demande. 

Donc, je pense que votre option côté client inclut l’utilisation de HttpRequestMessage décrit dans ici . Si vous voulez résoudre le problème à partir du serveur et si votre corps de message fonctionnerait bien dans les paramètres de requête, vous pouvez essayer cela au lieu d'envoyer la requête dans le corps du message. 

Personnellement, je pense que DELETE devrait être autorisé à avoir un corps de message et ne devrait pas être ignoré sur un serveur car il existe certainement des cas d'utilisation similaires à celui que vous avez mentionné ici. 

Dans tous les cas pour une discussion plus productive à ce sujet, veuillez regarder this .

2
Swagata Prateek

Mon API comme ci-dessous:

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

Appel du côté serveur 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
            {

            }
0
nativegrip