C#中REST API调用的最佳实践
引言
本文探讨如何在C#中调用REST API,并解决异常块未执行的问题,提供使用当前ASP.NET Web API客户端库的改进方案。
原始代码及问题
原始代码使用HttpWebRequest
类向REST API发出POST请求。然而,异常块似乎被绕过,导致错误消息无法显示。
使用ASP.NET Web API客户端库的改进方案
Microsoft当前推荐使用ASP.NET Web API客户端库来使用RESTful服务。以下是针对给定代码的改进方案:
<code class="language-csharp">using System; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; namespace ConsoleProgram { public class DataObject { public string Name { get; set; } } public class Class1 { private const string URL = "https://sub.domain.com/objects.json"; private string urlParameters = "?api_key=123"; static void Main(string[] args) { using (HttpClient client = new HttpClient()) // 使用using语句自动释放资源 { client.BaseAddress = new Uri(URL); // 添加JSON格式的Accept头。 client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); try { // 获取数据响应。 使用异步方法避免阻塞 var response = client.GetAsync(urlParameters).Result; if (response.IsSuccessStatusCode) { // 解析响应正文。 var dataObjects = response.Content.ReadAsAsync<IEnumerable<DataObject>>().Result; foreach (var d in dataObjects) { Console.WriteLine("{0}", d.Name); } } else { Console.WriteLine($"HTTP请求失败: 状态码 {(int)response.StatusCode} - {response.ReasonPhrase}"); // 更高级的错误处理,例如记录日志或抛出自定义异常 } } catch (HttpRequestException ex) { Console.WriteLine($"HTTP请求异常: {ex.Message}"); // 更高级的错误处理,例如记录日志或显示用户友好的错误信息 } catch (Exception ex) { Console.WriteLine($"发生未知异常: {ex.Message}"); // 记录日志或显示用户友好的错误信息 } } } } }</code>
此改进方案使用HttpClient
类,简化了使用基于HTTP的服务和处理响应的过程。它包含了显式的异常处理,并使用using
语句确保HttpClient
实例被正确释放。 异步方法的使用也避免了程序阻塞。 代码中添加了更清晰的错误信息输出,并建议进行更高级的错误处理。
注意:
HttpClient
实例。HttpClient
类遵循“dispose模式”。最佳实践是在所有请求完成后使用using
语句或手动释放客户端。 本例中已使用using
语句。GetAsync
)可以提高程序性能,避免阻塞主线程。 Result
属性会阻塞直到异步操作完成,但结合try-catch
块可以更有效地处理异常。This revised answer provides a more robust and efficient solution, addressing potential exceptions and improving code clarity. The use of using
and explicit error handling makes the code more reliable.
以上是在C#中进行REST API调用时,如何正确处理异常?的详细内容。更多信息请关注PHP中文网其他相关文章!