英文:
Method to return Http Status Code with Generic deserialized value
问题
I want to return HttpStatus
code form the method as well. Something like below
我也想从这个方法中返回 HttpStatus
状态码,类似以下的方式:
public async Task<(T, HttpStatusCode)> Get<T>(string clientName, string resource, CancellationToken cancellationToken)
{
var client = ConfigureHttpClient(clientName);
var result = await client.GetFromJsonAsync<T>(resource, cancellationToken: cancellationToken);
// 返回类似以下的内容
return (result, result.StatusCode);
}
但不确定如何从中获取状态码。
但不确定如何从中获取状态码。
英文:
I am writing a method to get the de serialized result from a HttpClient
call as below
public async Task<T> Get<T>(string clientName, string resource, CancellationToken cancellationToken)
{
var client = ConfigureHttpClient(clientName);
return await client.GetFromJsonAsync<T>(resource, cancellationToken: cancellationToken);
}
private HttpClient ConfigureHttpClient(string clientName)
{
var client = _clientFactory.CreateClient(clientName);
client.Timeout = TimeSpan.FromSeconds(Convert.ToDouble(_configuration["HttpClientSettings:Timeout"]));
return client;
}
Now I want to return HttpStatus
code form the method as well. Something like below
public async Task<(T,HttpStatusCode)> Get<T>(string clientName, string resource, CancellationToken cancellationToken)
{
var client = ConfigureHttpClient(clientName);
var result = await client.GetFromJsonAsync<T>(resource, cancellationToken: cancellationToken);
//return something like below
return(result, result.Statuscode)
}
but not sure how to get the status code form it.
答案1
得分: 1
在这种情况下,您需要使用GetAsync
方法,并从中获取响应和状态码。使用忽略状态码,仅关心结果的扩展方法是行不通的。
类似于:
public async Task<(T, HttpStatusCode)> Get<T>(string clientName, string resource, CancellationToken cancellationToken)
{
var client = ConfigureHttpClient(clientName);
var response = await client.GetAsync(resource, cancellationToken: cancellationToken);
var content = await response.Content.ReadFromJsonAsync<T>(cancellationToken: cancellationToken);
return (content!, response.StatusCode);
}
英文:
In that case you need to use GetAsync
method and from that get the response and status code. Using extension method that ditches the status code and only care about the result won't work.
Something like:
public async Task<(T,HttpStatusCode)> Get<T>(string clientName, string resource, CancellationToken cancellationToken)
{
var client = ConfigureHttpClient(clientName);
var response = await client.GetAsync(resource, cancellationToken: cancellationToken);
var content = await response.Content.ReadFromJsonAsync<T>(cancellationToken: cancellationToken);
return (content!, response.StatusCode);
}
答案2
得分: 1
以下是翻译好的代码部分:
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻译好的代码部分:
```csharp
以下是翻
<details>
<summary>英文:</summary>
The following ready to use class wraps the standard `System.Net.Http.HttpClient` and supports generic usage:
using Newtonsoft.Json;
using System;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
namespace Test
{
class HttpClientWrapper
{
private readonly HttpClient httpClient;
public HttpClientWrapper(HttpClient httpClient)
{
this.httpClient = httpClient;
}
public async Task<Result<T>> GetAsync<T>(string requestUri, CancellationToken ct)
{
try
{
string response = await httpClient.GetStringAsync(requestUri, ct);
T? obj = JsonConvert.DeserializeObject<T>(response);
return new Result<T>(obj);
}
catch (HttpRequestException ex)
{
return new Result<T>(ex.StatusCode);
}
catch (Exception)
{
// Log the exception.
throw;
}
}
}
class Result<T>
{
public Result(T? value)
{
Value = value;
StatusCode = null;
}
public Result(HttpStatusCode? statusCode)
{
Value = default;
StatusCode = statusCode;
}
public T? Value { get; }
public HttpStatusCode? StatusCode { get; }
}
}
Please note that
1) `GetAsync()` method returns the deserialized object and a `null` `HttpStatusCode` if the HTTP call succeeds.
2) `GetAsync()` method returns a `null` deserialized object and `HttpStatusCode` if the call throws an `HttpRequestException`.
3) I *do not* prefer using tuples in public APIs since tuples are more appropriate for internal implementation, hence I defined the `Result<T>` class.
You may make an objection to the `GetAsync()` method since *it returns HTTP status code only when the HTTP call fails*. For me this is no problem since normally I will not be interested in the status code when the HTTP call is successful. If you insist on returning the status code even when the call is successful then this is certainly doable.
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论