Как отправить DELETE с JSON в REST API с помощью HttpClient

Мне нужно отправить команду delete в службу REST API с содержимым JSON с использованием класса HttpClient и не могу заставить это работать.

API-вызов:

DELETE /xxx/current
{
 "authentication_token": ""
}

потому что я не могу добавить какой-либо контент в оператор ниже:

HttpResponseMessage response = client.DeleteAsync(requestUri).Result;

Я знаю, как сделать эту работу с 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);

но я делаю это без RestSharp.

Ответы

Ответ 1

Хотя может быть и поздно ответить на этот вопрос, но Я столкнулся с аналогичной проблемой, и для меня работал следующий код.

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);

Ответ 2

Вы можете использовать эти методы расширения:

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");
}

Ответ 3

Ответ Farzan Hajian все еще не работал у меня, я мог установить контент запроса, но на самом деле он не был отправлен на сервер.

В качестве альтернативы вы можете посмотреть, как использовать заголовок X-HTTP-Method-Override. Это сообщает серверу, что вы хотите, чтобы он обрабатывал запрос так, как если бы вы отправили другой глагол, чем тот, который вы отправили. Вам нужно будет убедиться, что сервер правильно обрабатывает этот заголовок, но если это возможно, вы можете просто отправить запрос и добавить: X-HTTP-Method-Override:DELETE в заголовки, и это будет эквивалент запроса DELETE с телом.

Ответ 4

Попробуйте

Edited

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
}

Здесь вы можете найти очень похожую проблему.

Edited
Я не уверен, что передача запроса запроса для запроса DELETE является хорошим подходом. Особенно, если это только для ваших целей аутентификации. Я предпочел бы поставить authentication_token в заголовки. Это потому, что в моем решении мне не придется анализировать весь орган запроса, чтобы проверить, что текущий запрос правильно аутентифицирован. Как насчет других типов запросов? Вы всегда проходите authentication_token в теле запроса?