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;
}
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);
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.
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
{
}