webentwicklung-frage-antwort-db.com.de

Übergeben von Textinhalten beim Aufrufen einer Delete-Web-API-Methode mit System.Net.Http

Ich habe ein Szenario, in dem ich meine Web API Delete-Methode aufrufen muss, die wie folgt aufgebaut ist:

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

Der Trick ist, dass ich, um die Abfrage zu beenden, sie durch den Textkörper senden muss und DeleteAsync keinen Parameter für json hat, wie dies bei post der Fall ist. Weiß jemand, wie ich dies mit System.Net.Http-Client in c # tun kann?

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

Hier ist, wie ich es erreicht habe

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

Ich denke, der Grund, warum HttpClient so entworfen wurde, ist, dass, obwohl die HTTP 1.1-Spezifikation den Nachrichtentext für DELETE -Anforderungen zulässt, dies im Wesentlichen nicht erwartet wird, da die Spezifikation keine Semantik dafür definiert, wie sie definiert ist Hier . HttpClient folgt streng der HTTP-Spezifikation, sodass Sie sehen, dass Sie der Anforderung keinen Nachrichtentext hinzufügen können.

Also, ich denke, Ihre Option von der Client-Seite beinhaltet die Verwendung von HttpRequestMessage, beschrieben in hier . Wenn Sie das Problem über das Backend beheben möchten und Ihr Nachrichtentext in Abfrageparametern gut funktionieren würde, können Sie dies versuchen, anstatt die Abfrage im Nachrichtentext zu senden.

Ich persönlich denke, DELETE sollte einen Nachrichtentext haben dürfen und auf einem Server nicht ignoriert werden, da es sicherlich Anwendungsfälle dafür gibt, wie den, den Sie hier erwähnt haben.

Für eine produktivere Diskussion schauen Sie sich bitte this an.

2
Swagata Prateek

Meine API wie folgt:

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

Aufruf von C # -Serverseite

            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