如何将reqres.in等外部接口数据拉取到自有Web API中?
拉取reqres用户数据到Web API的可行解决方案
首先你需要先修正现有users类的问题:当前的构造函数要求传入int和string两个参数,JSON反序列化时需要无参构造函数才能正常实例化对象,否则会触发反序列化报错。同时reqres的接口返回结果是带分页信息的嵌套结构,你需要额外定义外层响应类接收数据。
以下是两种常用的落地方案,都基于.NET生态实现:
方案1:原生IHttpClientFactory + System.Text.Json(无需引入第三方依赖)
- 第一步:修正实体类定义
// 类名首字母大写符合C#命名规范,也可以保留原名users public class Users { // 新增无参构造函数供反序列化使用 public Users(){} public Users(int ID, string url) { id = ID; } public int id { get; set; } public string email { get; set; } public string first_name { get; set; } public string last_name { get; set; } public string avatar { get; set; } } // 对应reqres接口的外层响应结构 public class ReqresUserResponse { public int page { get; set; } public int per_page { get; set; } public int total { get; set; } public int total_pages { get; set; } public List<Users> data { get; set; } }
- 第二步:在Program.cs中注册HttpClient服务,避免手动实例化HttpClient导致的端口耗尽问题
// .NET 6+ 顶层语句写法 builder.Services.AddHttpClient();
- 第三步:编写数据拉取逻辑,可以写在控制器或者单独的服务类中
private readonly IHttpClientFactory _httpClientFactory; // 构造函数注入IHttpClientFactory public YourService(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } public async Task<List<Users>> FetchReqresUsersAsync() { var client = _httpClientFactory.CreateClient(); // 发起GET请求拉取数据 var response = await client.GetAsync("https://reqres.in/api/users/"); // 校验请求是否成功,非2xx状态码会抛出异常 response.EnsureSuccessStatusCode(); // 反序列化响应结果 var responseData = await response.Content.ReadFromJsonAsync<ReqresUserResponse>(); // responseData.data即为拉取到的用户列表,可按需存入数据库、或直接返回给你的API调用方 return responseData.data; }
方案2:使用Newtonsoft.Json反序列化(适配已有Newtonsoft.Json依赖的老项目)
拉取逻辑和方案1一致,仅反序列化步骤替换为Newtonsoft.Json的实现即可:
var jsonString = await response.Content.ReadAsStringAsync(); var responseData = JsonConvert.DeserializeObject<ReqresUserResponse>(jsonString);
可选优化点
- reqres接口默认分页返回数据,如果需要拉取全量用户,可以先请求第一页拿到
total_pages字段,循环请求所有页码合并用户列表即可 - 可以引入Polly配置重试、熔断策略,处理接口请求超时、失败的异常场景
- 拉取到数据后可以按需做字段校验、格式转换,再写入你的业务存储层
内容的提问来源于stack exchange,提问作者cloud michael
相关产品推荐
相关产品推荐

