C# - 如何从 http 请求中获取 HTTP 状态代码

Nic*_*ick 4 c# api httprequest

我有以下代码,作为 POST 请求按预期工作(给定正确的 URL 等)。似乎我在读取状态代码时遇到了问题(我收到了成功的 201,根据该数字,我需要继续处理)。知道如何获取状态代码吗?

static async Task CreateConsentAsync(Uri HTTPaddress, ConsentHeaders cconsentHeaders, ConsentBody cconsent)
{
    HttpClient client = new HttpClient();

    try
    {
        client.BaseAddress = HTTPaddress;
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
        client.DefaultRequestHeaders.Add("Connection", "keep-alive");
        client.DefaultRequestHeaders.Add("Cache-Control", "no-cache");

        client.DefaultRequestHeaders.Add("otherHeader", myValue);
        //etc. more headers added, as needed...

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, client.BaseAddress);

        request.Content = new StringContent(JsonConvert.SerializeObject(cconsent, Formatting.Indented), System.Text.Encoding.UTF8, "application/json");

        Console.WriteLine("\r\n" + "POST Request:\r\n" + client.DefaultRequestHeaders + "\r\nBody:\r\n" + JsonConvert.SerializeObject(cconsent, Formatting.Indented) + "\r\n");

        await client.SendAsync(request).ContinueWith
        (
            responseTask => 
            {
                Console.WriteLine("Response: {0}", responseTask.Result + "\r\nBody:\r\n" + responseTask.Result.Content.ReadAsStringAsync().Result);
            }
        );

        Console.ReadLine();
    }
    catch (Exception e)
    {
        Console.WriteLine("Error in " + e.TargetSite + "\r\n" + e.Message);
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ath*_*ras 7

您的结果中有一个状态代码。

responseTask.Result.StatusCode
Run Code Online (Sandbox Code Playgroud)

或者更好

    var response = await client.SendAsync(request);
    var statusCode = response.StatusCode;
Run Code Online (Sandbox Code Playgroud)

  • 是的,要返回状态代码值,您需要执行“(int)response.StatusCode” (2认同)

Dai*_*Dai 3

  • ContinueWith如果您已经在函数内部,它有助于避免使用,async因为您可以使用(更干净的)await关键字。

  • 如果您await调用SendAsync,您将获得一个HttpResponseMessage对象,您可以从以下位置获取状态代码:

  • 另外,将IDisposable对象包装在using()块中(除了HttpClient- 应该是static单例或更好,使用IHttpClientFactory)。

  • 不要用于HttpClient.DefaultRequestHeaders特定于请求的标头,HttpRequestMessage.Headers而是使用。

  • 标头将自动为您Connection: Keep-alive发送。HttpClientHandler
  • 您确定需要发送Cache-control: no-cache请求吗?如果您使用 HTTPS,那么几乎可以保证不会有任何代理缓存导致任何问题 - 并且HttpClient也不使用 Windows Internet 缓存。
  • 不要使用Encoding.UTF8,因为它添加了前导字节顺序标记。请改用私有UTF8Encoding实例。
  • .ConfigureAwait(false)await始终与不在线程敏感上下文中运行的所有代码(例如 WinForms 和 WPF)一起使用。
private static readonly HttpClient _httpClient = new HttpClient();
private static readonly UTF8Encoding _utf8 = new UTF8Encoding( encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true );

static async Task CreateConsentAsync( Uri uri, ConsentHeaders cconsentHeaders, ConsentBody cconsent )
{
    using( HttpRequestMessage req = new HttpRequestMessage( HttpMethod.Post, uri ) )
    {
        req.Headers.Accept.Add( new MediaTypeWithQualityHeaderValue("*/*") );
        req.Headers.Add("Cache-Control", "no-cache");
        req.Headers.Add("otherHeader", myValue);
        //etc. more headers added, as needed...

        String jsonObject = JsonConvert.SerializeObject( cconsent, Formatting.Indented );
        request.Content = new StringContent( jsonObject, _utf8, "application/json");

        using( HttpResponseMessage response = await _httpClient.SendAsync( request ).ConfigureAwait(false) )
        {
            Int32 responseHttpStatusCode = (Int32)response.StatusCode;
            Console.WriteLine( "Got response: HTTP status: {0} ({1})", response.StatusCode, responseHttpStatusCode );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)