当前位置:首页 » 《随便一记》 » 正文

上位机:winform调用webapi接口GET和POST实现案例

27 人参与  2024年12月17日 08:01  分类 : 《随便一记》  评论

点击全文阅读


本文分两部分:

第一部分:搭建本地ASP.Net Core Web API环境

自己建立api接口可以方便本机进行测试

在VisualStudio新建项目

点击下一步,不用配置HTTPS,我用的是.NET8环境,根据自己实际需要去进行选择

创建API方法并使用swagger

这是项目自带的文件,我们删除重新创建自己实际需要的控制器

右键新建MVC控制器

新建一个api方法,把控制器上的路径补充完整,方法的请求方式根据实际业务来,这里用get请求

[Route("api/[controller]/[action]")]

然后下载swagger组件,下载这三个

下载完毕后在StartUp文件去进行注册,没有文件的话新建一个

 public class Startup {     public Startup(IConfiguration configuration)      {     Configuration = configuration;     }     public IConfiguration Configuration { get; }     public void ConfigureServices(IServiceCollection services)     {         services.AddControllers(); // 添加 MVC 控制器服务         services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "ID Build Api", Version = "v1" }); });//使用Swagger     }     public void Configure(IApplicationBuilder app, IWebHostEnvironment env)     {         if (env.IsDevelopment())         {             app.UseDeveloperExceptionPage();         }         app.UseRouting();                  //手动新增swagger注册         app.UseSwagger();         app.UseEndpoints(endpoints =>         {             endpoints.MapControllers(); // 配置控制器路由         });         app.UseSwaggerUI(c =>         {             c.SwaggerEndpoint( "v1/swagger.json","ID Build V1");//使用swagger交互UI模式         });     } }

在LaunchSettings.json文件中去观察Http和Express中的LaunchUrl是否更改成swagger,没有更改的话手动更改

在TestController中输入下列代码,Get和post是方便上位机客户端进行get或post获取响应代码,Test是自己手动运行程序进行简单测试一下

 [HttpGet] public IActionResult Get() {     var result = new     {         Message = "GET request received successfully!",         Time = DateTime.Now     };     return Ok(result); } [HttpGet] public string Test() {     return "返回Test"; } [HttpPost] public ActionResult<TestModel> Post([FromBody] TestModel model) {     if (model == null)     {         return BadRequest("Invalid input data."); // 返回 400 Bad Request     }     model.sum = model.num1 + model.num2;     // 返回成功结果     return Ok(model); // 返回 200 OK,并附带数据 }

点击execute获取测试值

第二部分:搭建客户端winfom

新建项目=》选择Windows窗体,填写你的项目名称

在from窗体中添加一个button按钮,双击进去自动生成Click事件

这是我封装好的请求代码

  /// <summary>  ///   /// </summary>  /// <param name="url"></param>  /// <returns></returns>  /// <exception cref="HttpRequestException"></exception>  public static async Task<string> GetAsync(string url)  {      using var client = new HttpClient();      try      {          // 发送 GET 请求          HttpResponseMessage response = await client.GetAsync(url);          response.EnsureSuccessStatusCode(); // 确保返回成功          // 读取响应内容          string content = await response.Content.ReadAsStringAsync();          return content;      }      catch (Exception ex)      {          throw new HttpRequestException($"GET request failed: {ex.Message}", ex);      }  }  /// <summary>  /// 封装post请求代码  /// </summary>  /// <typeparam name="TResult">根据实际需要建立对应的数据模型类</typeparam>  /// <param name="url"></param>  /// <param name="data"></param>  /// <returns></returns>  public static TResult Post<TResult>(string url, object data)  {      using HttpClient client = new HttpClient();      try      {          // 序列化数据为 JSON          var jsonData = JsonConvert.SerializeObject(data);          // 创建请求内容          HttpContent content = new StringContent(jsonData, Encoding.UTF8, "application/json");          // 发送 POST 请求          HttpResponseMessage res = client!.PostAsync(url, content).Result;          // 检查响应是否成功          if (res.StatusCode == System.Net.HttpStatusCode.OK)          {              string resMsgStr =  res.Content.ReadAsStringAsync().Result;              var result = JsonConvert.DeserializeObject<TResult>(resMsgStr);              return result!;          }          else          {              MessageView.Ins.MessageBoxShow(res.StatusCode.ToString(), 3);              return default!;          }      }      catch (Exception ex)      {          MessageView.Ins.MessageBoxShow(ex.Message, 3);          return default!;      }  }  /// <summary>  /// 发送http请求  /// </summary>  /// <param name="url">目标服务器的地址</param>  /// <param name="method">请求方式</param>  /// <param name="data">请求体数据</param>  /// <param name="isJson">请求体是否为json格式</param>  /// <returns></returns>  public static async Task<string> Send(string url, HttpType method = HttpType.GET, string data = "", bool isJson = false)  {      using HttpClient client = new HttpClient();      try      {          HttpRequestMessage request = new HttpRequestMessage          {              Method = new HttpMethod(method.ToString()),              RequestUri = new Uri(url)          };          // 如果是 POST 或 PUT,写入请求体          if (method == HttpType.POST || method == HttpType.PUT)          {              request.Content = new StringContent(                  data,                  Encoding.UTF8,                  isJson ? "application/json" : "application/x-www-form-urlencoded"              );          }          // 发送请求并获取响应          HttpResponseMessage response = await client.SendAsync(request);          // 确保请求成功          response.EnsureSuccessStatusCode();          // 读取响应内容          string result = await response.Content.ReadAsStringAsync();          return result;      }      catch (Exception ex)      {          // 捕获异常并返回错误信息          return $"Error: {ex.Message}";      }  }

在button事件中添加代码调用

 var model = new TestModel { num1 = 1 ,num2 = 2}; var data = Commons.Post<TestModel>("http://localhost:5069/api/test/Post", model); var data2 = await Commons.GetAsync("http://localhost:5069/api/test/Get"); string jsonData = "{ \"num1\": 20, \"num2\": 30 }"; string response = await Commons.Send("http://localhost:5069/api/test/Post", HttpType.POST, jsonData,true); AddLog.Info(response);

TestModel是自己在客户端建立的数据模型类,服务端api也是需要建立相应的model类内容一致

最后可以得到api服务器返回的结果


点击全文阅读


本文链接:http://zhangshiyu.com/post/202307.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1