当前位置:

首页 > 编程开发 > C#怎么发送HTTP请求 C#如何使用HttpClient调用REST API接口获取数据【网络】

C#怎么发送HTTP请求 C#如何使用HttpClient调用REST API接口获取数据【网络】

C#怎么发送HTTP请求 C#如何使用HttpClient调用REST API接口获取数据【网络】 HttpClient 必须复用,不能每次 new 很多开发者踩的第一个坑,就是图省事,在方法里直接 new HttpClient()。这看似方便,实则后患无穷。频繁创建新实例,会导致底层套接字端口来不

本文目录

    C#怎么发送HTTP请求 C#如何使用HttpClient调用REST API接口获取数据【网络】

    C#怎么发送HTTP请求 C#如何使用HttpClient调用REST API接口获取数据【网络】

    HttpClient 必须复用,不能每次 new

    很多开发者踩的第一个坑,就是图省事,在方法里直接 new HttpClient()。这看似方便,实则后患无穷。频繁创建新实例,会导致底层套接字端口来不及释放,最终引发端口耗尽和恼人的 SocketException。不仅如此,每次新建连接,DNS解析缓存也无法复用,连接池的优势荡然无存,性能自然上不去。

    那么,正确的复用姿势是什么?在 .NET Core 2.1 及更高版本中,最佳实践是通过依赖注入,使用 IServiceCollection.AddHttpClient() 将其注册为单例或作用域服务。如果是在控制台应用或简单的脚本里,一个简单有效的办法是将其声明为静态只读字段。

    • 典型的错误写法:var client = new HttpClient(); 放在方法内部 —— 这意味着每次调用都会新建一个。
    • 推荐的静态复用写法:private static readonly HttpClient _client = new HttpClient();
    • 额外提醒:除非你非常确定该实例的生命周期已经结束且后续绝不会再使用,否则不要手动去调用 _client.Dispose(),让框架来管理它。

    GET 请求带参数要用 Uri.EscapeDataString 或 QueryHelpers

    构建GET请求的查询字符串,是另一个高频出错点。直接进行字符串拼接,比如手写 ?key=value&key2=value2,一旦参数值里包含空格、中文、&、=这些特殊字符,整个URL结构就可能被破坏,导致服务端返回400错误或者解析异常。尤其是当参数值来自用户输入或数据库时,风险极高。

    所以,别再手动拼接了。推荐使用 UriBuilder 配合 QueryHelpers(需要引用 Microsoft.AspNetCore.WebUtilities 包)来安全地构建URL。

    • 推荐方式示例:
      var uri = new UriBuilder("https://api.example.com/users");
      uri.Query = QueryHelpers.AddQueryString("", new Dictionary {
          ["name"] = "张三",
          ["page"] = "1"
      });
      var response = await _client.GetAsync(uri.ToString());
    • 不推荐的做法:使用类似 $"https://...?name={name}" 的字符串插值。这种方式下,中文字符会变成乱码,而参数中的 & 符号更可能直接截断查询字符串,引发不可预知的问题。

    POST JSON 数据必须设 Content-Type 并用 StringContent

    发送POST请求提交JSON数据时,一个常见的疏忽是忘了设置正确的请求头。很多初学者会这样写:client.PostAsync(url, new StringContent(json, Encoding.UTF8)),结果服务端收到的虽然是一段JSON文本,但因为缺少 Content-Type: application/json 这个关键头信息,无法正确解析请求体,最终返回415 Unsupported Media Type错误。

    • 正确的完整写法应该是:
      var json = JsonSerializer.Serialize(new { username = "alice", pwd = "123" });
      var content = new StringContent(json, Encoding.UTF8, "application/json");
      var response = await _client.PostAsync("https://api.example.com/login", content);
    • 需要警惕的混淆:不要用 FormUrlEncodedContent 来发送JSON。这个类是为 application/x-www-form-urlencoded 格式设计的,它会将整个JSON字符串当作一个字段值进行编码,导致服务端完全无法解析出预期的对象结构。
    • 补充一点:如果调用的API要求Bearer Token认证,记得在发送请求前设置好请求头:_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

    异步方法必须 await,别用 .Result 或 .Wait()

    在异步编程模型里,阻塞异步任务是一个大忌。特别是在ASP.NET Core这类拥有同步上下文(SynchronizationContext)的Web应用环境中,在控制器里调用 task.Result 或 .Wait() 极易引发线程死锁,导致应用无响应。HttpClient 的所有核心方法,如 GetAsync、PostAsync,都是真正的异步操作,必须用 await 关键字来驱动。

    • 绝对要避免的写法:var res = client.GetAsync(url).Result; 或者 .Wait()。
    • 在ASP.NET Core控制器中的正确做法:将Action方法标记为 async Task,并在方法体内使用 await。
    • 在控制台程序中的处理:对于C# 7.1及以上版本,可以使用 static async Task Main(string[] args) 作为入口点。如果需要在其他地方同步等待,可以考虑使用 await MainAsync().ConfigureAwait(false) 来避免潜在的上下文问题。

    说到底,使用HttpClient发送HTTP请求,真正的难点往往不在于“如何发送出去”,而在于背后的连接复用策略、参数编码的安全性以及异步流程的控制。这三个关键点如果没对齐,接口在测试时可能一切正常,一旦上线,间歇性的失败、缓慢的响应,甚至持续上涨的内存消耗,就会接踵而至。这才是问题的关键所在。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 API rest
    相关文章 更多
    编程和我
    编程和我

    考取了程序员证书,却无法与“程序员”身份画等号,更偏爱算法和底层操作,对软件工程兴趣寥寥。编程作为兴趣能带来挑战与喜悦,一旦沦为重复工作便失去意义。坚持自然学习,远胜于强制赶进度。

    如何在 Rest Assured 中精准验证 HTTP 响应头
    如何在 Rest Assured 中精准验证 HTTP 响应头

    在RestAssured中验证HTTP响应头需分三步:将期望键值对转换为Header对象列表,调用getHeaders().asList()提取实际头,使用Hamcrest断言everyItem(is(in(...)))进行子集校验,推荐子集匹配而非完全相等,确保契约测试准确且可复用,避免响应头顺序依赖,提升测试鲁棒性。

    使用Golang操作TMDb API的使用小结
    使用Golang操作TMDb API的使用小结

    golang-tmdb库简化了与TMDbAPIv3的交互,支持获取电影、电视等媒体数据。需注册获取API密钥,支持自动重试和自定义基础URL。使用Go1.13+版本,通过goget安装后可用APIKey或BearerToken初始化客户端,常与GORM、Gin等库结合构建后端服务。

    Golang 测试 HTTP API 方法详解
    Golang 测试 HTTP API 方法详解

    使用httptest可高效测试GolangHTTPAPI。1.用NewRecorder模拟请求并检查状态码、响应体和头信息;2.测试路由和中间件时将ServeMux注入测试;3.用NewServer启动临时服务进行端到端验证。

    PHP API接口开发指南_PHP RESTful设计详解
    PHP API接口开发指南_PHP RESTful设计详解

    开发PHPRESTfulAPI需理解HTTP协议与REST设计原则,使用GET、POST、PUT、DELETE等方法操作资源。2.项目结构应包含入口文件index.php、数据库配置、模型和响应工具。3.通过.htaccess实现URL重写,统一请求入口。4.index.php解析请求路径与方法,调用对应逻辑处理并返回JSON格式数据。

    想让Pandas更快?试试Modin加速!
    想让Pandas更快?试试Modin加速!

    选自towardsdatascience作者:ParulPandey机器之心编译参与:GeekAI、Chita「通过更改一行代码扩展你的pandas工作流。」Pandas是数据科学领域的专业人员所熟知的库。它提供了高性能且易于使用的结构和数据分析工具。然而,当处理超大数据集时,单核运行的Pandas性能会大打折扣,用户不得不转向不同的分布式系统来提升性能。然而,为了提升性能而进行的这种权衡会带来陡峭的学习曲线。实际上,用户只希望Pandas运行得更快,而不是为特定的硬件设置调整他们的工

    DirectX Redist 2010年2月版发布
    DirectX Redist 2010年2月版发布

    今天微软发布了2010年首个directxredistribute。推荐各位更新。不知directx为何物的同学请看此处(引用自微软):MicrosoftDirectX是这样一组技术:它们旨在使基于Windows的计算机成为运行和显示具有丰富多媒体元素(例如全色图形、视频、3D动画和丰富音频)的应用程序的理想平台。DirectX包括安全和性能更新程序,以及许多涵盖所有技术的新功能。应用程序可以通过使用DirectXAPI来访问这些新功能。下载地址http://download.micr

    诺基亚API登陆谷歌云,开发者使用更便捷
    诺基亚API登陆谷歌云,开发者使用更便捷

    近日,诺基亚宣布其三项网络API——按需服务质量、号码验证以及设备位置验证——正式登陆谷歌云市场,为全球开发者提供更加便捷的API接入方式。谷歌云市场为用户打造了一个集中展示谷歌云及其合作伙伴生态解决方案的统一目录,方便用户查找和使用所需服务。开发者可以通过谷歌云市场调用诺基亚的API,结合“网络即代码”平台及开发者门户的功能,在无需深入理解底层网络技术的前提下,实现对网络能力的标准化访问,从而在全球移动网络中开发并部署新型应用。未来,诺基亚还将陆续推出更多API上线谷歌云市场。诺基亚

    VBA API_04:如何创建按钮
    VBA API_04:如何创建按钮

    在创建了窗体的基础上,接下来我们将进一步添加一个按钮来增强程序的交互性。按钮是Windows系统中预定义的控件,因此无需额外注册,直接使用CreateWindowEx函数即可。在创建窗体之后、显示窗体之前,我们可以插入代码来创建这个按钮。按钮的父窗口句柄(hWndParent)应当设置为之前创建的窗体的句柄(hWnd):'创建窗体hWnd=CreateWindowEx(0,"myForm","myForm",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USED

    PHP Web 服务开发与 API 设计错误处理
    PHP Web 服务开发与 API 设计错误处理

    PHPWeb服务开发中的错误处理涉及使用try-catch块、错误常量和自定义错误处理程序。在API设计中,最佳实践包括使用HTTP状态码、定义JSON错误响应、提供友好的错误消息,并使用自定义错误处理中间件来一致地处理错误,例如:使用自定义错误处理中间件捕获异常并返回JSON响应,其中包括错误代码和消息。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。