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

营业执照上有以上除网站制作青浦网站制作su35

营业执照上有以上除网站制作,青浦网站制作su35,站长工具网站排名,微网站 方案文章目录 项目地址一、Refit1.1 安装需要的包1.2 创建接口IGitHubApi1.3 创建RefitGitHubService1. 实现接口2. 注册服务 1.4 修改使用方法 二、Http resilience2.1 安装所需要的包2.2 创建resilience pipeline简单版2.3 创建全局的resilience处理1. 创建清理全局ResilienceHan…

文章目录

  • 项目地址
  • 一、Refit
    • 1.1 安装需要的包
    • 1.2 创建接口IGitHubApi
    • 1.3 创建RefitGitHubService
      • 1. 实现接口
      • 2. 注册服务
    • 1.4 修改使用方法
  • 二、Http resilience
    • 2.1 安装所需要的包
    • 2.2 创建resilience pipeline简单版
    • 2.3 创建全局的resilience处理
      • 1. 创建清理全局ResilienceHandler
      • 2. 添加全局resilience
      • 3. 添加自定义的resilience策略
      • 4. 使用自定义策略
  • 三、游标分页
    • 3.1 创建所需要的DTOs
      • 1. 创建游标分页的请求参数
      • 2. 创建CollectionResponse
      • 3. 添加游标编码和解码的DTO
    • 3.2 创建游标查询的Controller
      • 1. 传入带游标的query
      • 2. 对query里的游标解码查询
      • 3. 数据查询逻辑
      • 2.3 测试


项目地址

  • 教程作者:
  • 教程地址:
  • 代码仓库地址:
  • 所用到的框架和插件:
dbt 
airflow

一、Refit

可以发起Http请求用于替换我们自己手动写的获取githup外部app服务的方法

1.1 安装需要的包

在这里插入图片描述

1.2 创建接口IGitHubApi

  • 用 Refit 自动帮你生成访问 GitHub API 的客户端

namespace DevHabit.Api.Services;//每次调用这个接口的时候,自动给 HTTP 请求带上这两个头
[Headers("User-Agent: DevHabit/1.0", "Accept: application/vnd.github+json")]
public interface IGitHubApi
{[Get("/user")] //GET 请求,访问的是 GitHub API 的 /user 路径Task<ApiResponse<GitHubUserProfileDto>> GetUserProfile([Authorize(scheme: "Bearer")] string accessToken, //自动添加jwt Token在请求头中CancellationToken cancellationToken = default);[Get("/users/{username}/events")] //GET 请求,访问的是 GitHub API 的 /users/{username}/events 路径Task<ApiResponse<IReadOnlyList<GitHubEventDto>>> GetUserEvents(string username,[Authorize(scheme: "Bearer")] string accessToken, // accessToken自动插到请求头里(带身份认证)int page = 1,[AliasAs("per_page")] int perPage = 100, //告诉RefitGitHub API 要求参数名是 per_page(不是 C# 里的驼峰 PerPageCancellationToken cancellationToken = default);
}

1.3 创建RefitGitHubService

1. 实现接口

  • 实现接口方法的地方
using System.Net.Http.Headers;
using DevHabit.Api.DTOs.GitHub;
using Newtonsoft.Json;
using Refit;namespace DevHabit.Api.Services;public sealed class RefitGitHubService(IGitHubApi gitHubApi, ILogger<GitHubService> logger)
{public async Task<GitHubUserProfileDto?> GetUserProfileAsync(string accessToken,CancellationToken cancellationToken = default){ArgumentException.ThrowIfNullOrEmpty(accessToken);ApiResponse<GitHubUserProfileDto> response = await gitHubApi.GetUserProfile(accessToken, cancellationToken);if (!response.IsSuccessStatusCode){logger.LogWarning("Failed to get user profile from GitHub. Status code: {StatusCode}", response.StatusCode);return null;}return response.Content;}public async Task<IReadOnlyList<GitHubEventDto>?> GetUserEventsAsync(string username,string accessToken,int page = 1,int perPage = 100,CancellationToken cancellationToken = default){ArgumentException.ThrowIfNullOrEmpty(accessToken);ArgumentException.ThrowIfNullOrEmpty(username);ApiResponse<IReadOnlyList<GitHubEventDto>> response =await gitHubApi.GetUserEvents(username,accessToken,page,perPage,cancellationToken);if (!response.IsSuccessStatusCode){logger.LogWarning("Failed to get user events from GitHub. Status code: {StatusCode}", response.StatusCode);return null;}return response.Content;}
}

2. 注册服务

  • 注册该服务在DependencyInjection

在这里插入图片描述

1.4 修改使用方法

  • 替换之前使用githubService方法的Controller
    在这里插入图片描述

二、Http resilience

  • 请求上面接口,有时候会出现问题,我们需要处理请求api接口的问题

2.1 安装所需要的包

在这里插入图片描述

2.2 创建resilience pipeline简单版

  • 直接给需要使用的地方添加,这里我们使用refit获取第三方github的api数据,所以在该服务后面添加
    在这里插入图片描述

2.3 创建全局的resilience处理

1. 创建清理全局ResilienceHandler

  • 如果我们配置了全局resilience,但是部分服务又想执行自己的熔断措施,就需要先清理当前全局的措施,在添加自己的
namespace DevHabit.Api.Extensions;
public static class ResilienceHttpClientBuilderExtensions
{public static IHttpClientBuilder InternalRemoveAllResilienceHandlers(this IHttpClientBuilder builder){builder.ConfigureAdditionalHttpMessageHandlers(static (handlers, _) =>{for (int i = handlers.Count - 1; i >= 0; i--){if (handlers[i] is ResilienceHandler){handlers.RemoveAt(i);}}});return builder;}
}
  • 使用: 在需要清除的服务,先清除
    在这里插入图片描述

2. 添加全局resilience

  • 直接在服务里使用微软的包即可
    在这里插入图片描述

3. 添加自定义的resilience策略

  • 如果上面的包里的方法不够使用,我们可以添加自己的策略;
  • 创建自己的测试策略:在 HttpClient 发送每一个请求前,强制延迟 10 秒再发送。
 namespace DevHabit.Api.Services;public sealed class DelayHandler : DelegatingHandler
{protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken){await Task.Delay(10000, cancellationToken);return await base.SendAsync(request, cancellationToken);}
}

4. 使用自定义策略

在这里插入图片描述

三、游标分页

3.1 创建所需要的DTOs

1. 创建游标分页的请求参数

  • Curor主要是一个index用来记录上一页的位置
namespace DevHabit.Api.DTOs.Entries;
public sealed record EntriesCursorQueryParameters : AcceptHeaderDto
{public string? Cursor { get; init; }public string? Fields { get; init; }public string? HabitId { get; init; }public DateOnly? FromDate { get; init; }public DateOnly? ToDate { get; init; }public EntrySource? Source { get; init; }public bool? IsArchived { get; init; }public int Limit { get; init; } = 10;
}

2. 创建CollectionResponse

  • 该实体用来表示表示含有items和links的实体
namespace DevHabit.Api.DTOs.Common;
public sealed class CollectionResponse<T> : ICollectionResponse<T>, ILinksResponse
{public List<T> Items { get; init; }public List<LinkDto> Links { get; set; }
}
  • 实例化该结构:

在这里插入图片描述

3. 添加游标编码和解码的DTO

  • 将最后一条数据的Id和时间进行base64的编码和解码,防止数据泄密
namespace DevHabit.Api.DTOs.Entries;
public sealed record EntryCursorDto(string Id, DateOnly Date)
{//将一个游标(ID 和时间)编码为字符串,前端分页请求时可用public static string Encode(string id, DateOnly date){var cursor = new EntryCursorDto(id, date); // 创建一个游标对象string json = JsonSerializer.Serialize(cursor); // 序列化为 JSON 字符串return Base64UrlEncoder.Encode(Encoding.UTF8.GetBytes(json)); // 转成 Base64,避免 JSON 暴露或格式错误}public static EntryCursorDto Decode(string? cursor){if (string.IsNullOrWhiteSpace(cursor)){return null;}try{string json = Base64UrlEncoder.Decode(cursor); //解码 Base64 字符串return JsonSerializer.Deserialize<EntryCursorDto>(json); // 反序列化回游标对象}catch{return null;}}
}

3.2 创建游标查询的Controller

流程梳理:

1. 传入带游标的query

在这里插入图片描述

2. 对query里的游标解码查询

  • 如果携带了游标,对游标进行解码,并且根据游标的信息查询数据
    在这里插入图片描述

3. 数据查询逻辑

  1. 获取比Limit多的数据11条
  2. 如果数据大于10条,说明还有下一页
  3. 将最后一条数据的id和Date,编码为下一个游标
  4. 去除掉多余的+1的数据,保证每次10条
  5. 将数据返回给前端
    在这里插入图片描述

2.3 测试

  • 当我们发起一个需要100条数据的请求,如果还有下一页的数据,将会得到有next-page的links
    在这里插入图片描述
http://www.dtcms.com/a/493191.html

相关文章:

  • 做网站写概要设计wordpress转discuz
  • 网站app开发费用关键词分析软件
  • 新网域名网站网站域名注册空间
  • 乐从网站建设东莞网站开发哪家强
  • 大学生课程设计网站宜昌网站设计公司
  • 注册完域名之后怎么找到网站安康市110报警平台
  • 网站如何做关健词收录企业网站设计方式
  • 做网站 嵌入支付网站建设的研究背景
  • 优秀网站设计参考水果商城的设计与实现
  • wordpress为什么很卡如何优化关键词的方法
  • 电子商务运营网站用wordpress建仿站
  • 网站备案后要做什么营销类图片
  • 济南网站建设多少费用wordpress 手动 摘录
  • 网站宣传推广的目的北京知名vi设计公司
  • 十年经验网站开发公司软装设计图效果图
  • 网站如何在360做提交求职网站建设
  • 网站怎样才有流量合肥网站建设工作室
  • 做汽车网站网站的开发环境设计
  • 网站一直被攻击怎么办营销培训主题
  • 棋盘游戏类网站开发如何注册网站免费的吗
  • 网站黑链怎么做的英文网站建设合同
  • 网站精神文件建设专栏枣阳网站建设等服务
  • [Sora] 从检查点恢复训练 | `Booster`接口 | EMA模型 | .safetensors
  • wordpress 部署云南优化公司
  • 郓城那家网站做的好客厅装修效果图片大全
  • 网站建设荣茂服务器管理软件
  • 企业网站开发需要餐饮众筹模板网站建设
  • 网站建设说课ppt工会网站建设的重要性
  • 什么叫网站建设和维护百度wordpress插件下载
  • h5网站案例qq推广工具