web-dev-qa-db-ja.com

JSONを使用してDELETEをREST APIにHttpClientを使用して送信する方法

HttpClientクラスを使用してJSONコンテンツでREST APIサービスに削除コマンドを送信する必要があり、これを機能させることはできません。

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なしでそれを成し遂げました。

29

この質問に答えるのは遅いかもしれませんが、私は同様の問題に直面しており、次のコードが私のために働きました。

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);
44
Farzan Hajian

次の拡張メソッドを使用できます。

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

Farzan Hajianからの答えはまだ私にとってはうまくいきませんでした。リクエストの内容を設定できましたが、実際にはサーバーに送信されませんでした。

別の方法として、 X-HTTP-Method-Override ヘッダーの使用を確認できます。これは、実際に送信したものとは異なる動詞を送信したかのように要求を処理するようにサーバーに指示します。サーバーがこのヘッダーを正しく処理することを確認する必要がありますが、処理する場合はPOST要求を追加してX-HTTP-Method-Override:DELETEをヘッダーに追加すると、それは本文を含むDELETEリクエストに相当します。

3
kevev22

で試す

編集済み

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
}

ここ 非常に類似した問題を見つけることができます。

編集済み
DELETEリクエストのリクエスト本文を渡すのが良いアプローチかどうかわかりません特に、これが認証目的のみの場合。 authentication_tokenをヘッダーに。私のソリューションでは、現在のリクエストが正しく認証されていることを確認するためにリクエスト本文全体を解析する必要がないためです。他の種類のリクエストはどうですか?あなたは常にauthentication_tokenリクエスト本文に?

0
rraszewski