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

Wpf 使用 Prism 实战开发Day16

客户端使用RestSharp库调用WebApi 动态加载数据


在MyDoTo客户端中,使用NuGet 安装两个库

  1. RestSharp 
  2. Newtonsoft.Json 


一. RestSharp 简单的使用测试例子

当前章节主要目的是:对RestSharp 库,根据项目需求再次进行封装。下面先做个简单的使用测试例子。

1.首先运行WebApi 项目,获取Memo 单条数据

请求成功后,可以看到请求的URL和返回的Response body(响应内容)

2.在MyToDo客户端的 MemoViewModel中 ,CreateMemoList 方法加载数据时进行以下修改测试

var client = new RestSharp.RestClient("http://localhost:5143");
var requestGet = new RestRequest("api/Memo/Get",Method.Get);
requestGet.AddParameter("id","2");
var response= client.Execute(requestGet);
var con= response.Content;

 如果需要解析拿到的具体对象数据,需对结果进行 JsonConvert.DeserializeObject 反序列化。具体的解析步骤就是:

  • 拿到对象数据,把JSON 生成C# 实体类。进行反序列化的时候把当前数据实体类传进去就OK了。

 3.把WebApi项目已经启动后,选择 MyToDo 客户端项目,右键,启动一个新实例

或者右键解决方案==》属性,配置多个启动项目


4.最后在MyToDo客户端打断点调试。运行起来后,命中断点,可以看到请求的接口有数据返回了

 基本的简单使用就是这样。在RestSharp 官网 有各种使用实例,复杂的涉到Token 身份认证等都有。


二.对 RestSharp 进行封装使用,集成到客户端中

新建一个服务层文件夹(Service),用于存放封装对WebApi 接口的访问等处理逻辑

1. 首先把 ApiResponse 共用类,移到MyToDo.Shared 中,并且再添加请求结果泛型的ApiResponse 类

    public class ApiResponse{/// <summary>/// 失败/// </summary>/// <param name="message"></param>/// <param name="status"></param>public ApiResponse(string message, bool status = false){ this.Message = message;this.Status = status;}/// <summary>/// 成功/// </summary>/// <param name="status"></param>/// <param name="result"></param>public ApiResponse(bool status,object result) {this.Status = status;this.Result = result;}/// <summary>/// 返回消息/// </summary>public string Message { get; set; }/// <summary>/// 返回状态/// </summary>public bool Status { get; set; }/// <summary>/// 结果/// </summary>public object Result { get; set; }}public class ApiResponse<T>{/// <summary>/// 返回消息/// </summary>public string Message { get; set; }/// <summary>/// 返回状态/// </summary>public bool Status { get; set; }/// <summary>/// 结果/// </summary>public T Result { get; set; }}

且MyToDo 客户端要引用MyToDo.Shared 项目。

2. 在 MyToDo 项目Service 文件夹中,封装一个通用的请求类型类(BaseRequest)主要用于构造请求接口的时候,传递的参数。

    public class BaseRequest{/// <summary>/// 请求类型/// </summary>public Method Method { get; set; }/// <summary>/// 路由,也就是Url/// </summary>public string Route { get; set; }/// <summary>/// 数据类型描述/// </summary>public string ContentType { get; set; } = "application/json";/// <summary>/// 请求参数/// </summary>public object Paramenter { get; set; }}

 3.同样,接着再封装一个访问WebApi 的共用类(HttpRestClient)

public class HttpRestClient
{private readonly string apiUrl;protected readonly RestClient clinet;public HttpRestClient(string apiUrl) {this.apiUrl = apiUrl;clinet = new RestClient(apiUrl);}//通用请求public async Task<ApiResponse> ExecuteAsync(BaseRequest baseRequest){var request = new RestRequest(baseRequest.Route, baseRequest.Method);//添加请求头request.AddHeader("Content-Type", baseRequest.ContentType);//添加请求参数if (baseRequest.Paramenter != null){//把请求参数进行序列化后,添加进来。并且设置序列化的类型request.AddParameter("param",JsonConvert.SerializeObject(baseRequest.Paramenter),ParameterType.RequestBody);}var response=await clinet.ExecuteAsync(request);//把结果进行反序列化后,返回出去return JsonConvert.DeserializeObject<ApiResponse>(response.Content);}//通用带泛型请求public async Task<ApiResponse<T>> ExecuteAsync<T>(BaseRequest baseRequest){var request = new RestRequest(baseRequest.Route, baseRequest.Method);//添加请求头request.AddHeader("Content-Type", baseRequest.ContentType);//添加请求参数if (baseRequest.Paramenter != null){//把请求参数进行序列化后,添加进来。并且设置序列化的类型request.AddParameter("param", JsonConvert.SerializeObject(baseRequest.Paramenter), ParameterType.RequestBody);}var response = await clinet.ExecuteAsync(request);//把结果进行反序列化后,返回出去return JsonConvert.DeserializeObject<ApiResponse<T>>(response.Content);}
}

4.创建通用的请求服务类(IBaseService)

    public interface IBaseService<TEntity> where TEntity : class{//添加Task<ApiResponse<TEntity>> AddAsync(TEntity entity);//更新Task<ApiResponse<TEntity>> UpdateAsync(TEntity entity);//删除Task<ApiResponse> DeleteAsync(int id);//根据id,取第一条数据Task<ApiResponse<TEntity>> GetFirstOfDefaultAsync(int id);//获取所有数据Task<ApiResponse<PagedList<TEntity>>> GetAllAsync(QueryParameter parameter);}

5. 实现(BaseService)通用服务类。继承 IBaseService

 public class BaseService<TEntity> : IBaseService<TEntity> where TEntity : class{private readonly HttpRestClient client;private readonly string serverName;public BaseService(HttpRestClient client,string serverName){this.client = client;this.serverName = serverName;}public async Task<ApiResponse<TEntity>> AddAsync(TEntity entity){var request = new BaseRequest() {Method = Method.Post,Route=$"api/{serverName}/Add",Paramenter=entity};return await client.ExecuteAsync<TEntity>(request);}public async Task<ApiResponse> DeleteAsync(int id){var request = new BaseRequest(){Method = Method.Delete,Route = $"api/{serverName}/Delete?id={id}"};return await client.ExecuteAsync(request);}public async Task<ApiResponse<PagedList<TEntity>>> GetAllAsync(QueryParameter parameter){var request = new BaseRequest(){Method = Method.Get,Route = $"api/{serverName}/GetAll?pageIndex={parameter.PageIndex}&pageSize={parameter.PageSize}&Search={parameter.Search}"};return await client.ExecuteAsync<PagedList<TEntity>> (request);}public async Task<ApiResponse<TEntity>> GetFirstOfDefaultAsync(int id){var request = new BaseRequest(){Method = Method.Delete,Route = $"api/{serverName}/Get?id={id}"};return await client.ExecuteAsync<TEntity>(request);}public async Task<ApiResponse<TEntity>> UpdateAsync(TEntity entity){var request = new BaseRequest(){Method = Method.Post,Route = $"api/{serverName}/Update",Paramenter = entity};return await client.ExecuteAsync<TEntity>(request);}}

三.待办事项调用WebApi服务接口获取数据

1.首先创建(待办事项服务接口类) IToDoService ,继承IBaseService 基类

    public interface IToDoService:IBaseService<ToDoDto>{}

2.接着,要实现(待办事项服务接口类)ToDoService。继承BaseService和IToDoService 

    public class ToDoService : BaseService<ToDoDto>, IToDoService{/// <summary>/// 构造中,直接传控制器名称进去。因为在Web Api项目中,待办事项控制器的名称,就是叫ToDo/// </summary>/// <param name="client"></param>/// <param name="serverName"></param>public ToDoService(HttpRestClient client, string serverName= "ToDo") : base(client, serverName){}}

3.然后,还需要在 App.xaml.cs 中,进行依赖注入

    /// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : PrismApplication{/// <summary>/// 创建启动页面/// </summary>/// <returns></returns>protected override Window CreateShell(){return Container.Resolve<MainView>();}/// <summary>/// 依懒注入的方法/// </summary>/// <param name="containerRegistry"></param>protected override void RegisterTypes(IContainerRegistry containerRegistry){//对封装的http请求类,进行注入。并且设置一个默认参数containerRegistry.GetContainer().Register<HttpRestClient>(made:Parameters.Of.Type<string>(serviceKey:"webUrl"));//注册默认的服务地址containerRegistry.GetContainer().RegisterInstance(@"http://localhost:5143/",serviceKey: "webUrl");//注册服务containerRegistry.Register<IToDoService, ToDoService>();containerRegistry.RegisterForNavigation<AboutView>();containerRegistry.RegisterForNavigation<SkinView, SkinViewModel>();containerRegistry.RegisterForNavigation<IndexView, IndexViewModel>();containerRegistry.RegisterForNavigation<MemoView, MemoViewModel>();containerRegistry.RegisterForNavigation<ToDoView, ToDoViewModel>();containerRegistry.RegisterForNavigation<SettingsView, SettingsViewModel>();}}


4.最后,在ViewModels 中,去使用 待办事项接口服务(IToDoService )

public class ToDoViewModel:BindableBase{public ToDoViewModel(IToDoService toDoService){ToDoDtos = new ObservableCollection<ToDoDto>();AddCommand = new DelegateCommand(Add);this.toDoService = toDoService;CreateTodoList();}private bool isRightDrawerOpen;/// <summary>/// 右侧编辑窗口是否展开/// </summary>public bool IsRightDrawerOpen{get { return isRightDrawerOpen; }set { isRightDrawerOpen = value; RaisePropertyChanged(); }}public DelegateCommand AddCommand{ get; private set; }private ObservableCollection<ToDoDto> toDoDtos;private readonly IToDoService toDoService;/// <summary>/// 创建数据的动态集合/// </summary>public ObservableCollection<ToDoDto> ToDoDtos{get { return toDoDtos; }set { toDoDtos = value;RaisePropertyChanged(); }}async void CreateTodoList(){//添加查询条件var todoResult=await toDoService.GetAllAsync(new Shared.Parameters.QueryParameter(){PageIndex = 0,PageSize = 100,});if (todoResult.Status){toDoDtos.Clear();foreach (var item in todoResult.Result.Items){toDoDtos.Add(item);}}//for (int i = 0; i < 20; i++)//{//    toDoDtos.Add(new ToDoDto()//    {//        Title="标题"+i,//        Content="测试数据..."//    });//}}/// <summary>/// 添加待办/// </summary>/// <exception cref="NotImplementedException"></exception>private void Add(){IsRightDrawerOpen=true;}}

 四.代码结构

相关文章:

Wpf 使用 Prism 实战开发Day16

客户端使用RestSharp库调用WebApi 动态加载数据 在MyDoTo客户端中&#xff0c;使用NuGet 安装两个库 RestSharp Newtonsoft.Json 一. RestSharp 简单的使用测试例子 当前章节主要目的是&#xff1a;对RestSharp 库&#xff0c;根据项目需求再次进行封装。下面先做个简单的使用…...

八斗学习笔记

1 初始环境安装 Anaconda安装(一款可以同时创建跟管理多个python环境的软件) https://blog.csdn.net/run_success/article/details/134656460 Anaconda创建一个新python环境(安装人工智能常用的第三方python包&#xff0c;如&#xff1a;tensorflow、keras、pytorch) https://…...

【Uni-App】Vuex在vue3版本中的使用与持久化

Vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 简而言之就是用来存数据&#xff0c;可以有效减少使用组件传参出现的问题。 基本元素&#xff1a;…...

基于Qt 音乐播放器mp3(进阶)

​## 项目工具 工具名QtQt 5.14.2图标设计Adobe Ai音频素材剪映平台windowsgif录制ScreenGif录屏Win10 自带录屏 Win + G## 项目演示 先点击构建项目,项目构建完成后,再将本例的 myMusic 歌曲文件夹拷贝到可执行程序...

力扣唯一元素的和

题目&#xff1a; 给你一个整数数组 nums 。数组中唯一元素是那些只出现 恰好一次 的元素。 请你返回 nums 中唯一元素的 和 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,2] 输出&#xff1a;4 解释&#xff1a;唯一元素为 [1,3] &#xff0c;和为 4 。示例 2&#xf…...

力扣(leetcode)第169题多数元素(Python)

169.多数元素 题目链接&#xff1a;169.多数元素 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&am…...

springBoot - mybatis 多数据源实现方案

应用场景: 多数据源 小型项目 或者 大项目的临时方案中比较常用.在日常开发中,可能我们需要查询多个数据库,但是数据库实例不同,导致不能通过 指定schema的方式 区分不同的库, 这种情况下就需要我们应用程序配置多数据源 实现方式: 首先自定义实现 datasource数据源 为当前…...

unity 讯飞webapi在线语音合成

websocker插件使用的unitywebsocker 讯飞webapi&#xff0c;连接后只能请求一次&#xff0c;所以每次使用时进行连接&#xff0c;连接成功后进行请求&#xff0c;请求完成后关闭连接。 为什么连接后只能请求一次呢&#xff0c;可能是方便统计使用量。 如何通过音频数据计算出…...

[NCTF2019]Fake XML cookbook(特详解)

先试了一下弱口令&#xff0c;哈哈习惯了 查看页面源码发现xml function doLogin(){var username $("#username").val();var password $("#password").val();if(username "" || password ""){alert("Please enter the usern…...

腾讯云SDK并发调用优化方案

目录 一、概述 二、 网关的使用 2.1 核心代码 三、腾讯云SDK依赖包的改造 一、概述 此网关主要用于协调腾讯云SDK调用的QPS消耗&#xff0c;使得多个腾讯云用户资源能得到最大限度的利用。避免直接使用腾讯云SDK 时&#xff0c;在较大并发情况下导致接口调用异常。网关的工…...

【排序算法】C语言实现随机快排,巨详细讲解

文章目录 &#x1f680;前言&#x1f680;快排的核心过程partition&#xff08;划分过程&#xff09;&#x1f680;快排1.0&#x1f680;随机快速排序&#x1f680;稳定性 &#x1f680;前言 铁子们好啊&#xff01;继续我们排序算法今天要讲的是快排&#xff0c;通常大家所说…...

Java强训day13(选择题编程题)

选择题 编程题 题目1 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String s sc.nextLine();char[] c s.toCharArray();int i 0;int t 0;while (i < c.length) {if (c[i] ! \") {…...

搭建WebGL开发环境

前言 本篇文章介绍如何搭建WebGL开发环境 WebGL WebGL的技术规范继承自免费和开源的OpenGL ES标准&#xff0c;从某种意义上说&#xff0c;WebGL就是Web版的OpenGL ES&#xff0c;而OpenGL ES是从OpenGL中派生出来的。他们的应用环境有区别&#xff0c;一般来说&#xff1a;…...

学习嵌入式第十五天之结构体

用变量a给出下面的定义 a) 一个整型数&#xff08;An integer&#xff09; //int a;b) 一个指向整型数的指针&#xff08;A pointer to an integer&#xff09; //int *a;c) 一个指向指针的的指针&#xff0c;它指向的指针是指向一个整型数&#xff08;A pointer to a poin…...

【HDFS】一天一个RPC系列--updateBlockForPipeline

本文目标是: 弄清updateBlockForPipeline这个RPC的作用。弄清updateBlockForPipeline RPC的使用场景,代码里的调用点。一、updateBlockForPipeline的作用 其定义在ClientProtocol接口里,是Client与NameNode之间的接口。 看其代码注释描述: 为一个under construction状态下…...

测试面试题(0101设计测试用例关键)

1. 测试计划 测试范围&#xff0c;本次改动的模块&#xff0c;新增了哪些功能测试策略&#xff0c;包含测试依据&#xff0c;测试准入标准&#xff0c;准出标准&#xff0c;测试重点及方法&#xff08;确认功能的优先级&#xff09;&#xff0c;测试工具的选择测试管理&#x…...

C++ 数论相关题目:高斯消元解异或线性方程组

输入一个包含 n 个方程 n 个未知数的异或线性方程组。 方程组中的系数和常数为 0 或 1 &#xff0c;每个未知数的取值也为 0 或 1 。 求解这个方程组。 异或线性方程组示例如下&#xff1a; M[1][1]x[1] ^ M[1][2]x[2] ^ … ^ M[1][n]x[n] B[1] M[2][1]x[1] ^ M[2][2]x[2]…...

嵌入式学习第十四天

1.结构体&#xff08;2&#xff09;: &#xff08;1&#xff09;结构体类型定义 &#xff08;2&#xff09;结构体变量的定义 &#xff08;3&#xff09;结构体元素的访问 &#xff08;4&#xff09;结构体的存储: 内存对齐: char 按照1字节对齐 …...

氢气泄漏检测仪使用方法:守护安全,从细节开始

随着科技的发展&#xff0c;我们的生活和工作环境中充满了各种潜在的危险。其中&#xff0c;氢气作为一种清洁能源&#xff0c;其使用日益广泛&#xff0c;但同时也带来了泄漏的风险。为了确保我们的安全&#xff0c;了解并正确使用氢气泄漏检测仪至关重要。下面将详细介绍氢气…...

【前端web入门第二天】01 html语法实现列表与表格_合并单元格

html语法实现列表与表格 文章目录: 1.列表 1.1 无序列表1.2 有序列表1.3 定义列表 2.表格 2.1 表格基本结构2.2 表格结构标签2.3 合并单元格 写在最前,第二天学习目标: 列表 表格 表单 元素为嵌套关系 1.列表 作用:布局内容排列整齐的区域。 列表分类:无序列表、有序列表…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...