web-dev-qa-db-fra.com

Obtenez les données d'une API externe avec une API principale asp.net

J'apprends à créer des API à l'aide du noyau ASP.NET, j'ai rencontré un problème, j'essaie d'exécuter une demande d'API externe à l'aide de mon API, mais je ne sais pas comment exécuter la demande et retourner le JSON de la demande, une aide?

Le flux de l'application ressemble à ceci:

SPA -> API WEB AspNet Core -> API externe

Ce que j'ai fait jusqu'à présent:

[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
        }

    }

Je dois faire la demande pour cette API:

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

Dans l'emplacement ID, j'ai besoin de passer un paramètre qui provient de la requête faite dans mon API;

Une aide pour ce problème?

Désolé de ne pas être une question aussi complexe.

Merci!!

7
Jefferson Bruchado

Vous pouvez utiliser une instance HttpClient pour obtenir ce que vous voulez. Cependant, je trouve toujours plus facile à utiliser RestSharp cependant.

Cela, bien sûr, dépendra de vos contraintes mais en supposant que vous n'en ayez pas pour ce cas, vous pouvez utiliser RestSharp pour effectuer l'appel à l'API externe:

Installez-le:

Install-Package RestSharp

Utilisation:

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);
}

Pour consommer la réponse de repos de RestSharp, vous devez utiliser le response.Content propriété.

Vous pouvez, par exemple, le désérialiser vers Json, le manipuler pour l'adapter à vos besoins et renvoyer les données requises à votre appelant API.

Exemple:

Disons que j'aimerais obtenir le classement de la Premier League 2017/18 (Id = 445):

J'obtiendrai beaucoup d'aide ci-dessous du légendaire paquet Newtonsoft.Json et un peu de syntaxe jpath mais je suppose que vous avez déjà utilisé les deux :)

Créez quelques modèles pour contenir les valeurs à renvoyer à l'appelant 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; }
}

Implémentez la méthode ci-dessous dans la classe de service, injectée dans votre contrôleur via DI/IoC pour éviter le couplage et augmenter la testabilité (comme nous le savons tous, nous devrions le faire correctement?). Je suppose que cette classe est RankingRepository dans votre exemple:

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;
    }
}

Utilisez-le depuis le contrôleur:

[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);
    }
}

J'espère que cela t'aides!

6
Karel Tamayo