返回带有通用反序列化值的HTTP状态代码的方法

huangapple go评论95阅读模式
英文:

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 状态码,类似以下的方式:

  1. public async Task<(T, HttpStatusCode)> Get<T>(string clientName, string resource, CancellationToken cancellationToken)
  2. {
  3. var client = ConfigureHttpClient(clientName);
  4. var result = await client.GetFromJsonAsync<T>(resource, cancellationToken: cancellationToken);
  5. // 返回类似以下的内容
  6. return (result, result.StatusCode);
  7. }

但不确定如何从中获取状态码。

但不确定如何从中获取状态码。

英文:

I am writing a method to get the de serialized result from a HttpClient call as below

  1. public async Task&lt;T&gt; Get&lt;T&gt;(string clientName, string resource, CancellationToken cancellationToken)
  2. {
  3. var client = ConfigureHttpClient(clientName);
  4. return await client.GetFromJsonAsync&lt;T&gt;(resource, cancellationToken: cancellationToken);
  5. }
  6. private HttpClient ConfigureHttpClient(string clientName)
  7. {
  8. var client = _clientFactory.CreateClient(clientName);
  9. client.Timeout = TimeSpan.FromSeconds(Convert.ToDouble(_configuration[&quot;HttpClientSettings:Timeout&quot;]));
  10. return client;
  11. }

Now I want to return HttpStatus code form the method as well. Something like below

  1. public async Task&lt;(T,HttpStatusCode)&gt; Get&lt;T&gt;(string clientName, string resource, CancellationToken cancellationToken)
  2. {
  3. var client = ConfigureHttpClient(clientName);
  4. var result = await client.GetFromJsonAsync&lt;T&gt;(resource, cancellationToken: cancellationToken);
  5. //return something like below
  6. return(result, result.Statuscode)
  7. }

but not sure how to get the status code form it.

答案1

得分: 1

在这种情况下,您需要使用GetAsync方法,并从中获取响应和状态码。使用忽略状态码,仅关心结果的扩展方法是行不通的。

类似于:

  1. public async Task<(T, HttpStatusCode)> Get<T>(string clientName, string resource, CancellationToken cancellationToken)
  2. {
  3. var client = ConfigureHttpClient(clientName);
  4. var response = await client.GetAsync(resource, cancellationToken: cancellationToken);
  5. var content = await response.Content.ReadFromJsonAsync<T>(cancellationToken: cancellationToken);
  6. return (content!, response.StatusCode);
  7. }
英文:

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:

  1. public async Task&lt;(T,HttpStatusCode)&gt; Get&lt;T&gt;(string clientName, string resource, CancellationToken cancellationToken)
  2. {
  3. var client = ConfigureHttpClient(clientName);
  4. var response = await client.GetAsync(resource, cancellationToken: cancellationToken);
  5. var content = await response.Content.ReadFromJsonAsync&lt;T&gt;(cancellationToken: cancellationToken);
  6. return (content!, response.StatusCode);
  7. }

答案2

得分: 1

以下是翻译好的代码部分:

  1. 以下是翻译好的代码部分:
  2. ```csharp
  3. 以下是翻译好的代码部分:
  4. ```csharp
  5. 以下是翻译好的代码部分:
  6. ```csharp
  7. 以下是翻译好的代码部分:
  8. ```csharp
  9. 以下是翻译好的代码部分:
  10. ```csharp
  11. 以下是翻译好的代码部分:
  12. ```csharp
  13. 以下是翻译好的代码部分:
  14. ```csharp
  15. 以下是翻译好的代码部分:
  16. ```csharp
  17. 以下是翻译好的代码部分:
  18. ```csharp
  19. 以下是翻译好的代码部分:
  20. ```csharp
  21. 以下是翻译好的代码部分:
  22. ```csharp
  23. 以下是翻译好的代码部分:
  24. ```csharp
  25. 以下是翻译好的代码部分:
  26. ```csharp
  27. 以下是翻译好的代码部分:
  28. ```csharp
  29. 以下是翻译好的代码部分:
  30. ```csharp
  31. 以下是翻译好的代码部分:
  32. ```csharp
  33. 以下是翻译好的代码部分:
  34. ```csharp
  35. 以下是翻译好的代码部分:
  36. ```csharp
  37. 以下是翻译好的代码部分:
  38. ```csharp
  39. 以下是翻译好的代码部分:
  40. ```csharp
  41. 以下是翻译好的代码部分:
  42. ```csharp
  43. 以下是翻译好的代码部分:
  44. ```csharp
  45. 以下是翻译好的代码部分:
  46. ```csharp
  47. 以下是翻译好的代码部分:
  48. ```csharp
  49. 以下是翻译好的代码部分:
  50. ```csharp
  51. 以下是翻译好的代码部分:
  52. ```csharp
  53. 以下是翻译好的代码部分:
  54. ```csharp
  55. 以下是翻译好的代码部分:
  56. ```csharp
  57. 以下是翻译好的代码部分:
  58. ```csharp
  59. 以下是翻译好的代码部分:
  60. ```csharp
  61. 以下是翻译好的代码部分:
  62. ```csharp
  63. 以下是翻译好的代码部分:
  64. ```csharp
  65. 以下是翻译好的代码部分:
  66. ```csharp
  67. 以下是翻译好的代码部分:
  68. ```csharp
  69. 以下是翻译好的代码部分:
  70. ```csharp
  71. 以下是翻译好的代码部分:
  72. ```csharp
  73. 以下是翻译好的代码部分:
  74. ```csharp
  75. 以下是翻译好的代码部分:
  76. ```csharp
  77. 以下是翻译好的代码部分:
  78. ```csharp
  79. 以下是翻译好的代码部分:
  80. ```csharp
  81. 以下是翻译好的代码部分:
  82. ```csharp
  83. 以下是翻译好的代码部分:
  84. ```csharp
  85. 以下是翻译好的代码部分:
  86. ```csharp
  87. 以下是翻译好的代码部分:
  88. ```csharp
  89. 以下是翻译好的代码部分:
  90. ```csharp
  91. 以下是翻译好的代码部分:
  92. ```csharp
  93. 以下是翻译好的代码部分:
  94. ```csharp
  95. 以下是翻译好的代码部分:
  96. ```csharp
  97. 以下是翻译好的代码部分:
  98. ```csharp
  99. 以下是翻译好的代码部分:
  100. ```csharp
  101. 以下是翻译好的代码部分:
  102. ```csharp
  103. 以下是翻译好的代码部分:
  104. ```csharp
  105. 以下是翻译好的代码部分:
  106. ```csharp
  107. 以下是翻译好的代码部分:
  108. ```csharp
  109. 以下是翻译好的代码部分:
  110. ```csharp
  111. 以下是翻译好的代码部分:
  112. ```csharp
  113. 以下是翻译好的代码部分:
  114. ```csharp
  115. 以下是翻译好的代码部分:
  116. ```csharp
  117. 以下是翻译好的代码部分:
  118. ```csharp
  119. 以下是翻译好的代码部分:
  120. ```csharp
  121. 以下是翻译好的代码部分:
  122. ```csharp
  123. 以下是翻译好的代码部分:
  124. ```csharp
  125. 以下是翻译好的代码部分:
  126. ```csharp
  127. 以下是翻译好的代码部分:
  128. ```csharp
  129. 以下是翻译好的代码部分:
  130. ```csharp
  131. 以下是翻译好的代码部分:
  132. ```csharp
  133. 以下是翻译好的代码部分:
  134. ```csharp
  135. 以下是翻译好的代码部分:
  136. ```csharp
  137. 以下是翻译好的代码部分:
  138. ```csharp
  139. 以下是翻译好的代码部分:
  140. ```csharp
  141. 以下是翻译好的代码部分:
  142. ```csharp
  143. 以下是翻译好的代码部分:
  144. ```csharp
  145. 以下是翻译好的代码部分:
  146. ```csharp
  147. 以下是翻译好的代码部分:
  148. ```csharp
  149. 以下是翻译好的代码部分:
  150. ```csharp
  151. 以下是翻译好的代码部分:
  152. ```csharp
  153. 以下是翻译好的代码部分:
  154. ```csharp
  155. 以下是翻译好的代码部分:
  156. ```csharp
  157. 以下是翻译好的代码部分:
  158. ```csharp
  159. 以下是翻译好的代码部分:
  160. ```csharp
  161. 以下是翻译好的代码部分:
  162. ```csharp
  163. 以下是翻译好的代码部分:
  164. ```csharp
  165. 以下是翻译好的代码部分:
  166. ```csharp
  167. 以下是翻译好的代码部分:
  168. ```csharp
  169. 以下是翻译好的代码部分:
  170. ```csharp
  171. 以下是翻译好的代码部分:
  172. ```csharp
  173. 以下是翻译好的代码部分:
  174. ```csharp
  175. 以下是翻译好的代码部分:
  176. ```csharp
  177. 以下是翻译好的代码部分:
  178. ```csharp
  179. 以下是翻
  180. <details>
  181. <summary>英文:</summary>
  182. The following ready to use class wraps the standard `System.Net.Http.HttpClient` and supports generic usage:
  183. using Newtonsoft.Json;
  184. using System;
  185. using System.Net;
  186. using System.Net.Http;
  187. using System.Threading;
  188. using System.Threading.Tasks;
  189. namespace Test
  190. {
  191. class HttpClientWrapper
  192. {
  193. private readonly HttpClient httpClient;
  194. public HttpClientWrapper(HttpClient httpClient)
  195. {
  196. this.httpClient = httpClient;
  197. }
  198. public async Task&lt;Result&lt;T&gt;&gt; GetAsync&lt;T&gt;(string requestUri, CancellationToken ct)
  199. {
  200. try
  201. {
  202. string response = await httpClient.GetStringAsync(requestUri, ct);
  203. T? obj = JsonConvert.DeserializeObject&lt;T&gt;(response);
  204. return new Result&lt;T&gt;(obj);
  205. }
  206. catch (HttpRequestException ex)
  207. {
  208. return new Result&lt;T&gt;(ex.StatusCode);
  209. }
  210. catch (Exception)
  211. {
  212. // Log the exception.
  213. throw;
  214. }
  215. }
  216. }
  217. class Result&lt;T&gt;
  218. {
  219. public Result(T? value)
  220. {
  221. Value = value;
  222. StatusCode = null;
  223. }
  224. public Result(HttpStatusCode? statusCode)
  225. {
  226. Value = default;
  227. StatusCode = statusCode;
  228. }
  229. public T? Value { get; }
  230. public HttpStatusCode? StatusCode { get; }
  231. }
  232. }
  233. Please note that
  234. 1) `GetAsync()` method returns the deserialized object and a `null` `HttpStatusCode` if the HTTP call succeeds.
  235. 2) `GetAsync()` method returns a `null` deserialized object and `HttpStatusCode` if the call throws an `HttpRequestException`.
  236. 3) I *do not* prefer using tuples in public APIs since tuples are more appropriate for internal implementation, hence I defined the `Result&lt;T&gt;` class.
  237. 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.
  238. </details>

huangapple
  • 本文由 发表于 2023年6月6日 13:10:00
  • 转载请务必保留本文链接:https://go.coder-hub.com/76411585.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定