Вы можете использовать экземпляр HttpClient
для достижения того, что вы хотите.Тем не менее, мне всегда легче использовать RestSharp .
Это, конечно, будет зависеть от ваших ограничений, но, если у вас их нет для этого случая, вы можете использовать RestSharp для вызова внешнего API:
Установите его:
Install-Package RestSharp
Использование:
using RestSharp;
[HttpGet("{id}", Name = "GetRanking")]
public IActionResult GetById(long id)
{
var client = new RestClient("http://api.football-
data.org/v1/competitions/445/leagueTable");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
//TODO: transform the response here to suit your needs
return Ok(data);
}
Для получения ответа остальных от RestSharp вы должны использоватьсвойство response.Content
.
Вы можете, например, десериализовать его в 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, чтобы избежать связывания и повысить тестируемость (как мы все знаем, мы должны поступить правильно?).Я предполагаю, что этот класс RankingRepository
в вашем примере:
public RankingRepository: IRankingRepository
{
public LeagueTableModel GetRankings(long id)
{
var client = new RestClient($"http://api.football-data.org/v1/competitions/{id}/leagueTable");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(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;
}
}
Используйте его из контроллера:
[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
var model = _rankingRepository.GetRankings(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);
}
}
Надеюсь, это поможет!