c# - example - Cómo enviar DELETE with JSON a la API REST mediante HttpClient
json rest api (4)
Tengo que enviar un comando de eliminación a un servicio de API REST con contenido JSON utilizando la clase HttpClient y no puedo hacer que esto funcione.
Llamada API:
DELETE /xxx/current
{
"authentication_token": ""
}
porque no puedo agregar ningún contenido en la siguiente declaración:
HttpResponseMessage response = client.DeleteAsync(requestUri).Result;
Sé cómo hacer que esto funcione con RestSharp:
var request = new RestRequest {
Resource = "/xxx/current",
Method = Method.DELETE,
RequestFormat = DataFormat.Json
};
var jsonPayload = JsonConvert.SerializeObject(cancelDto, Formatting.Indented);
request.Parameters.Clear();
request.AddHeader("Content-type", "application/json");
request.AddHeader ("Accept", "application/json");
request.AddParameter ("application/json", jsonPayload, ParameterType.RequestBody);
var response = await client.ExecuteTaskAsync (request);
pero lo he hecho sin RestSharp.
Aunque puede ser tarde para responder a esta pregunta, pero he enfrentado un problema similar y el siguiente código funcionó para mí.
HttpRequestMessage request = new HttpRequestMessage
{
Content = new StringContent("[YOUR JSON GOES HERE]", Encoding.UTF8, "application/json"),
Method = HttpMethod.Delete,
RequestUri = new Uri("[YOUR URL GOES HERE]")
};
await httpClient.SendAsync(request);
La respuesta de Farzan Hajian aún no funcionó para mí, pude establecer el contenido de la solicitud pero en realidad no se envió al servidor.
Como alternativa, puede considerar el uso del encabezado X-HTTP-Method-Override . Esto le indica al servidor que desea que trate la solicitud como si hubiera enviado un verbo diferente al que realmente envió. Deberá asegurarse de que el servidor maneje este encabezado correctamente, pero si lo hace, puede POSTAR la solicitud y agregar: X-HTTP-Method-Override:DELETE
a los encabezados y será el equivalente a una solicitud DELETE con un cuerpo.
Prueba con
Editado
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.your.url");
request.Method = "DELETE";
request.ContentType = "application/json";
request.Accept = "application/json";
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
string json = "{/"key/":/"value/"}";
streamWriter.Write(json);
streamWriter.Flush();
}
using (var httpResponse = (HttpWebResponse)request.GetResponse())
{
// do something with response
}
Here puedes encontrar un problema muy similar.
Editado
No estoy seguro de que pasar el cuerpo de la solicitud para la solicitud DELETE
sea un buen enfoque Especialmente cuando esto es sólo para su autenticación. Preferiré poner authentication_token
a los encabezados. Se debe a que en mi solución no tendré que analizar todo el cuerpo de la solicitud para verificar que la solicitud actual esté correctamente autenticada. ¿Qué pasa con otros tipos de solicitud? ¿Siempre pasas authentication_token
en el cuerpo de solicitud?
Puede utilizar estos métodos de extensión:
public static class HttpClientExtensions
{
public static Task<HttpResponseMessage> DeleteAsJsonAsync<T>(this HttpClient httpClient, string requestUri, T data)
=> httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Delete, requestUri) { Content = Serialize(data) });
public static Task<HttpResponseMessage> DeleteAsJsonAsync<T>(this HttpClient httpClient, string requestUri, T data, CancellationToken cancellationToken)
=> httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Delete, requestUri) { Content = Serialize(data) }, cancellationToken);
public static Task<HttpResponseMessage> DeleteAsJsonAsync<T>(this HttpClient httpClient, Uri requestUri, T data)
=> httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Delete, requestUri) { Content = Serialize(data) });
public static Task<HttpResponseMessage> DeleteAsJsonAsync<T>(this HttpClient httpClient, Uri requestUri, T data, CancellationToken cancellationToken)
=> httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Delete, requestUri) { Content = Serialize(data) }, cancellationToken);
private static HttpContent Serialize(object data) => new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
}