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!!
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!