gpt4 book ai didi

asp.net - 使用 asp.net 核心 API 从外部 API 获取数据

转载 作者:行者123 更新时间:2023-12-04 11:47:01 25 4
gpt4 key购买 nike

我正在学习使用 ASP.NET 核心创建 API,在此我遇到了一个问题,我正在尝试使用我的 API 执行对外部 API 的请求,但我不知道如何执行请求并返回请求的JSON,有什么帮助吗?

应用程序的流程如下所示:

SPA -> AspNet Core WEB API -> 外部 API

到目前为止我所做的:

[Route("api/[Controller]")]
public class RankingsController : Controller
{
private readonly IRankingRepository _rankingRepository;

public RankingsController(IRankingRepository rankingRepo)
{
_rankingRepository = rankingRepo;
}

[HttpGet("{id}", Name = "GetRanking")]
public IActionResult GetById(long id)
//Here is where I want to make the requisition
}

}

我需要对此 API 提出请求:

http://api.football-data.org/v1/competitions/ {id}/leagueTable

在 ID 位置,我需要传递一个来自我的 API 中的请求的参数;

对这个问题有什么帮助吗?

很抱歉没有提出这么复杂的问题。

谢谢!!

最佳答案

您可以使用 HttpClient实例来实现你想要的。但是,我总是觉得更容易使用 RestSharp尽管。

这当然取决于您的限制,但假设您没有这种情况,您可以使用 RestSharp 调用外部 API:

安装:
Install-Package RestSharp
用法:

using RestSharp;

[HttpGet("{id}", Name = "GetRanking")]
public async Task<IActionResult> GetByIdAync(long id)
{
var client = new RestClient($"http://api.football-data.org/v1/competitions/{id}/leagueTable");
var request = new RestRequest(Method.GET);
IRestResponse response = await client.ExecuteAsync(request);

//TODO: transform the response here to suit your needs

return Ok(data);
}

要使用来自 RestSharp 的剩余响应,您必须使用 response.Content属性(property)。

例如,您可以将其反序列化为 Json,对其进行操作以满足您的需求,并将所需的数据返回给您的 API 调用者。

示例:

假设我想获得 2017/18 赛季英超联赛的排名(Id = 445):

下面我会从传说中的 Newtonsoft.Json那里得到很多帮助包和一点 jpath语法,但我假设您已经使用过两者:)

创建几个模型来保存要返回给 API 调用者的值:
public class LeagueTableModel
{
public string LeagueCaption { get; set; }

public IEnumerable<StandingModel> Standings { get; set; }
}
public class StandingModel
{
public string TeamName { get; set; }

public int Position { get; set; }
}

在服务类中实现以下方法,通过 DI/IoC 注入(inject)到您的 Controller 中,以避免耦合并增加可测试性(众所周知,我们应该这样做吗?)。我假设这个类是 RankingRepository在您的示例中:
public RankingRepository: IRankingRepository 
{
public Task<LeagueTableModel> GetRankingsAsync(long id)
{
var client = new RestClient($"http://api.football-data.org/v1/competitions/{id}/leagueTable");
var request = new RestRequest(Method.GET);
IRestResponse response = await client.ExecuteAsync(request);
if (response.IsSuccessful)
{
var content = JsonConvert.DeserializeObject<JToken>(response.Content);

//Get the league caption
var leagueCaption = content["leagueCaption"].Value<string>();

//Get the standings for the league.
var rankings = content.SelectTokens("standing[*]")
.Select(team => new StandingModel
{
TeamName = (string)team["teamName"],
Position = (int)team["position"]
})
.ToList();

//return the model to my caller.
return new LeagueTableModel
{
LeagueCaption = leagueCaption,
Standings = rankings
};
}

//TODO: log error, throw exception or do other stuffs for failed requests here.
Console.WriteLine(response.Content);

return null;
}
}

从 Controller 使用它:
[Route("api/[Controller]")]
public class RankingsController : Controller
{
private readonly IRankingRepository _rankingRepository;

public RankingsController(IRankingRepository rankingRepo)
{
_rankingRepository = rankingRepo;
}

[HttpGet("{id}", Name = "GetRanking")]
public Task<IActionResult> GetByIdAsync(long id)
//Here is where I want to make the requisition
var model = await _rankingRepository.GetRankingsAsync(id);

//Validate if null
if (model == null)
return NotFound(); //or any other error code accordingly. Bad request is a strong candidate also.

return Ok(model);
}
}

希望这可以帮助!

关于asp.net - 使用 asp.net 核心 API 从外部 API 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53326123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com