当前位置: 首页 > news >正文

GKMLT通讯工具箱(WPF MVVM) - 05-WebAPI通讯

一、概述

WebAPI通讯模块实现了基于HTTP/HTTPS协议的RESTful API客户端功能,支持GET、POST等多种HTTP方法,提供JSON数据序列化/反序列化、Bearer Token认证、表单提交等功能。

二、通讯报文原理

2.1 HTTP协议基础

WebAPI通讯基于HTTP/HTTPS协议,采用请求-响应模式:

客户端 → HTTP请求 → 服务器 服务器 → HTTP响应 → 客户端

2.2 HTTP请求报文结构

POST /api/resource HTTP/1.1 Host: example.com Content-Type: application/json Authorization: Bearer eyJhbGciOiJIUzI1NiIs... Content-Length: 123 {"key":"value","data":123}

请求报文组成:

  • 请求行:方法(POST/GET)、URL路径、HTTP版本
  • 请求头:Content-Type、Authorization等
  • 请求体:JSON数据、表单数据等

2.3 HTTP响应报文结构

HTTP/1.1 200 OK Content-Type: application/json Content-Length: 456 {"status":"success","result":{"data":456}}

响应报文组成:

  • 状态行:HTTP版本、状态码(200/401/500等)、状态描述
  • 响应头:Content-Type、Content-Length等
  • 响应体:JSON数据、错误信息等

2.4 JSON数据格式

请求JSON示例:

{"userName":"admin","password":"123456","deviceCode":"DEVICE001"}

响应JSON示例:

{"code":200,"message":"success","data":{"token":"eyJhbGciOiJIUzI1NiIs...","expireTime":"2026-12-31T23:59:59"}}

2.5 Bearer Token认证流程

1. 客户端发送登录请求(用户名+密码) 2. 服务器验证并返回Token 3. 客户端保存Token 4. 后续请求携带Token: Authorization: Bearer {token} 5. 服务器验证Token后返回数据

2.6 OAuth2表单提交

使用application/x-www-form-urlencoded格式:

POST /oauth/token HTTP/1.1 Content-Type: application/x-www-form-urlencoded grant_type=password&username=admin&password=123456&client_id=myapp

三、调用的库和方法

3.1 核心库

RestSharp库
  • 版本:通过NuGet包管理
  • 作用:简化HTTP客户端操作
  • 命名空间RestSharp

主要类:

  • RestClient:HTTP客户端,负责发送请求
  • RestRequest:HTTP请求封装
  • IRestResponse:HTTP响应接口
  • Method:HTTP方法枚举(GET/POST/PUT/DELETE)
Newtonsoft.Json库
  • 版本:JSON.NET
  • 作用:JSON序列化/反序列化
  • 命名空间Newtonsoft.Json

主要方法:

  • JsonConvert.SerializeObject():对象→JSON字符串
  • JsonConvert.DeserializeObject():JSON字符串→对象

3.2 核心类:WebApiHelper

3.2.1 HttpPost 方法

功能:发送JSON格式POST请求

方法签名:

publicstaticIRestResponseHttpPost<T>(stringurl,Tbody)

参数说明:

  • url:请求的API地址
  • body:请求体对象(泛型,会被序列化为JSON)

实现代码:

publicstaticIRestResponseHttpPost<T>(stringurl,Tbody){// 创建HTTP客户端RestClientclient=newRestClient(url);client.Timeout=5000;// 创建请求RestRequestrequest=newRestRequest(Method.POST);request.AddHeader("Content-Type","application/json");request.AddJsonBody(body,"application/json");// 生成请求JSON(用于日志)stringrequestJson=JsonConvert.SerializeObject(body,Formatting.Indented);// 执行请求IRestResponseresponse=client.Execute(request);// 触发JSON回调事件RaiseJsonDataEvent(requestJson,response.Content);returnresponse;}

调用示例:

varrequestData=new{userName="admin",password="123456"};varresponse=WebApiHelper.HttpPost("https://api.example.com/login",requestData);
3.2.2 HttpPostBearerToken 方法

功能:发送带Bearer Token的POST请求

方法签名:

publicstaticIRestResponseHttpPostBearerToken<T>(stringurl,stringtoken,Tbody)

参数说明:

  • url:请求的API地址
  • token:Bearer Token字符串
  • body:请求体对象

实现代码:

publicstaticIRestResponseHttpPostBearerToken<T>(stringurl,stringtoken,Tbody){RestClientclient=newRestClient(url);client.Timeout=5000;RestRequestrequest=newRestRequest(Method.POST);request.AddHeader("Content-Type","application/json");request.AddHeader("Authorization",$"Bearer{token}");request.AddJsonBody(body,"application/json");stringrequestJson=JsonConvert.SerializeObject(body,Formatting.Indented);IRestResponseresponse=client.Execute(request);RaiseJsonDataEvent(requestJson,response.Content);returnresponse;}

调用示例:

varrequestData=new{deviceId="DEVICE001",timestamp=DateTime.Now.ToString()};varresponse=WebApiHelper.HttpPostBearerToken("https://api.example.com/api/data","eyJhbGciOiJIUzI1NiIs...",requestData);
3.2.3 HttpPost (表单提交) 方法

功能:发送表单格式POST请求(OAuth2等场景)

方法签名:

publicstaticIRestResponseHttpPost(stringurl,Dictionary<string,string>para)

参数说明:

  • url:请求的API地址
  • para:表单参数字典

实现代码:

publicstaticIRestResponseHttpPost(stringurl,Dictionary<string,string>para){RestClientclient=newRestClient(url);client.Timeout=5000;RestRequestrequest=newRestRequest(Method.POST);request.AddHeader("Content-Type","application/x-www-form-urlencoded");// 构建表单数据字符串StringBuilderformData=newStringBuilder();foreach(stringkeyinpara.Keys){if(formData.Length>0){formData.Append("&");}formData.Append($"{Uri.EscapeDataString(key)}={Uri.EscapeDataString(para[key])}");}request.AddParameter("application/x-www-form-urlencoded",formData.ToString(),ParameterType.RequestBody);// 生成请求JSON(用于日志)stringrequestJson=JsonConvert.SerializeObject(para,Formatting.Indented);IRestResponseresponse=client.Execute(request);RaiseJsonDataEvent(requestJson,response.Content);returnresponse;}

调用示例:

varformData=newDictionary<string,string>{{"grant_type","password"},{"username","admin"},{"password","123456"},{"client_id","myapp"}};varresponse=WebApiHelper.HttpPost("https://api.example.com/oauth/token",formData);
3.2.4 HttpGet 方法

功能:发送GET请求

方法签名:

publicstaticIRestResponseHttpGet<T>(stringurl)

参数说明:

  • url:请求的API地址(可包含查询参数)

实现代码:

publicstaticIRestResponseHttpGet<T>(stringurl){RestClientclient=newRestClient(url);client.Timeout=5000;RestRequestrequest=newRestRequest(Method.GET);returnclient.Execute(request);}

调用示例:

varresponse=WebApiHelper.HttpGet<object>("https://api.example.com/api/users?page=1&size=10");
3.2.5 FormatJson 方法

功能:格式化JSON字符串(美化输出)

方法签名:

publicstaticstringFormatJson(stringjson)

实现代码:

publicstaticstringFormatJson(stringjson){try{objectobj=JsonConvert.DeserializeObject(json);returnJsonConvert.SerializeObject(obj,Formatting.Indented);}catch{returnjson;}}

3.3 事件机制

OnJsonDataReceived 事件

功能:当收到HTTP响应时触发,用于UI显示请求/响应数据

事件定义:

publicstaticeventAction<string,string>OnJsonDataReceived;

事件参数:

  • string requestJson:请求JSON字符串
  • string responseJson:响应JSON字符串

触发位置:

  • 所有HTTP方法执行后都会触发此事件

使用示例:

// 在ViewModel中订阅事件WebApiHelper.OnJsonDataReceived+=(request,response)=>{// 更新UI显示请求和响应RequestJson=WebApiHelper.FormatJson(request);ResponseJson=WebApiHelper.FormatJson(response);};

四、数据流程

4.1 完整的API调用流程

用户操作 ↓ ViewModel调用WebApiHelper方法 ↓ 创建RestClient和RestRequest ↓ 设置请求头(Content-Type、Authorization等) ↓ 序列化请求数据为JSON ↓ 发送HTTP请求 ↓ 接收HTTP响应 ↓ 触发OnJsonDataReceived事件 ↓ UI更新显示请求/响应数据

4.2 Bearer Token认证流程

1. 获取Token HttpPost(loginUrl, loginData) → Token 2. 保存Token 存储到ViewModel或配置文件 3. 使用Token访问API HttpPostBearerToken(apiUrl, token, data) → Data 4. Token过期处理 捕获401错误 → 重新获取Token → 重试请求

五、错误处理

5.1 常见HTTP状态码

状态码含义处理方式
200成功正常处理响应数据
400请求错误检查请求参数格式
401未授权重新登录获取Token
403禁止访问检查权限配置
404资源不存在检查API URL
500服务器错误联系API提供方

5.2 异常处理示例

try{varresponse=WebApiHelper.HttpPost(url,data);if(response.StatusCode==System.Net.HttpStatusCode.OK){// 成功处理varresult=JsonConvert.DeserializeObject<ResponseModel>(response.Content);}elseif(response.StatusCode==System.Net.HttpStatusCode.Unauthorized){// 401未授权,重新登录ShowErrorMessage("Token已过期,请重新登录");}else{// 其他错误ShowErrorMessage($"请求失败:{response.StatusCode}");}}catch(Exceptionex){// 网络异常或JSON解析错误ShowErrorMessage($"请求异常:{ex.Message}");}

六、性能优化

6.1 超时设置

client.Timeout=5000;// 5秒超时

6.2 连接池复用

建议创建单例RestClient实例,避免频繁创建/销毁。

6.3 异步调用

对于耗时API调用,使用异步方法避免阻塞UI线程:

awaitTask.Run(()=>{varresponse=WebApiHelper.HttpPost(url,data);});

七、安全性

7.1 HTTPS通信

生产环境必须使用HTTPS加密传输。

7.2 Token存储

  • 不要在日志中输出完整Token
  • 建议使用安全存储(如Windows Credential Manager)

7.3 敏感数据加密

密码等敏感数据在传输前应加密处理。

八、总结

WebAPI通讯模块提供了完整的HTTP客户端功能:

  1. 多种HTTP方法:支持GET、POST等常用方法
  2. 认证支持:Bearer Token、OAuth2表单认证
  3. JSON处理:自动序列化/反序列化
  4. 事件机制:请求/响应数据实时通知
  5. 错误处理:完善的异常捕获和状态码处理

该模块可广泛应用于对接各类RESTful API服务,如云平台、IoT平台、AI服务等场景。

http://www.jsqmd.com/news/730276/

相关文章:

  • 告别报告堆砌:超自动化巡检的智能分析与洞察
  • 运维入门指南:从基础到实战
  • 【限时开源】PHP 9.0 AI Bot Starter Kit正式发布:内置JWT鉴权、对话上下文管理、Token自动节流——仅开放前2000名下载
  • 某40m简支t梁桥毕业设计计算书_secret
  • YOLO26-seg分割优化:红外小目标 | 注意力机制改进 | 并行化注意力设计(PPA)模块,红外小目标暴力涨点
  • 从水土流失到城市经济:手把手教你用SPSS搞定地理学中的回归与聚类分析(附实战数据集)
  • 你还在用Python写AI后端?PHP 9.0异步生态已全面超越:实测QPS 4,820 vs Python FastAPI 2,160(附JMeter完整报告)
  • 2026年邓州毛坯房装修公司推荐 - 品牌排行榜
  • R语言交互式教学从入门到爆火:7个即学即用Shiny+ggplot2教学案例,教师速抢!
  • Python在TVA系统中的核心意义(2)
  • 需求驱动测试(RBT)在软件工程中的实践与价值
  • 2026年必备:15款去AI痕迹降AI工具实测,高效降低AIGC率(含免费版) - 降AI实验室
  • Unity Mod Manager:5分钟掌握Unity游戏模组管理的终极秘籍
  • TVA在机器人核心零部件制造与检测中的体验分享(2)
  • CUDA与Triton下的矩阵乘法优化实战
  • 2026年论文AI率过高怎么办?降AI率必看技巧与工具收藏 - 降AI实验室
  • R 4.5低代码分析工具正式发布:3小时搭建可投产BI看板,你还在写100行dplyr代码?
  • 逆向工程师的“瑞士军刀”:用FART12脱壳系统搞定邦邦、爱加密与企业壳的真实体验
  • 微信电脑版冗余文件清理工具(附下载链接)
  • R 4.5大数据分块处理实战手册(仅限内部团队验证的5层缓冲架构)
  • VidEmo视频情感分析:基于情感树推理的深度模型
  • AD新手避坑指南:Unknown Pin报错别慌,三步排查搞定PCB封装匹配
  • 25G SFP光模块:高速互联高性价比之选
  • 开源线索抓取工具:Apify平台上的Apollo式销售情报采集方案
  • 三步打造专属动态桌面:Wallpaper Engine创意工坊下载器全解析
  • 魔兽争霸3优化终极指南:用WarcraftHelper让经典游戏在现代电脑上流畅运行
  • 白云区演艺业三年行动方案落地 丁丁舞台技术聚焦灯光控台人才系统化培养
  • 从LaTeX论文到Beamer汇报:一份代码搞定两种文档,我是如何用Madrid主题统一我的学术输出的
  • Python在TVA系统中的核心意义(3)
  • 多阶段训练提升代码生成模型性能的实践