首页 > 后端开发 > C++ > 在C#中进行REST API调用时,如何正确处理异常?

在C#中进行REST API调用时,如何正确处理异常?

DDD
发布: 2025-01-25 14:36:11
原创
489 人浏览过

How to Properly Handle Exceptions When Making REST API Calls in C#?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板