Получайте данные из внешнего API с помощью основного API asp.net - PullRequest
0 голосов
/ 15 ноября 2018

Я учусь создавать API, используя ядро ​​ASP.NET, в этом я столкнулся с проблемой, я пытаюсь выполнить запрос на внешний 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 / соревнования / {ID} / leagueTable

В местоположении идентификатора мне нужно передать параметр, который приходит из запроса, сделанного в моем API;

Любая помощь по этой проблеме?

Извините, что не такой сложный вопрос.

Спасибо !!

1 Ответ

0 голосов
/ 15 ноября 2018

Вы можете использовать экземпляр 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);
    }
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...