Partilhar via


Uma API da Web que chama APIs da Web: Faça uma chamada a uma API

Aplica-se a: círculo verde com um símbolo de marca de seleção branco que indica que o conteúdo a seguir se aplica aos locatários da força de trabalho. Inquilinos da força de trabalho (saiba mais)

Depois de ter um token, você pode chamar uma API da Web protegida. Você costuma chamar as APIs de jusante a partir do controlador ou das páginas da sua API web.

Código do controlador

Quando você usa Microsoft.Identity.Web, você tem três cenários de uso:

Opção 1: Chamar o Microsoft Graph com o SDK

Nesse cenário, adicionou o pacote NuGet Microsoft.Identity.Web.GraphServiceClient e adicionou .AddMicrosoftGraph() no Startup.cs conforme especificado na configuração de código, e pode injetá-lo diretamente no controlador ou construtor de página para uso nas ações. A página Razor de exemplo a seguir exibe a foto do usuário conectado.

 [Authorize]
 [AuthorizeForScopes(Scopes = new[] { "user.read" })]
 public class IndexModel : PageModel
 {
     private readonly GraphServiceClient _graphServiceClient;

     public IndexModel(GraphServiceClient graphServiceClient)
     {
         _graphServiceClient = graphServiceClient;
     }

     public async Task OnGet()
     {
         var user = await _graphServiceClient.Me.GetAsync();
         try
         {
             using (var photoStream = await _graphServiceClient.Me.Photo.Content.GetAsync())
             {
                 byte[] photoByte = ((MemoryStream)photoStream).ToArray();
                 ViewData["photo"] = Convert.ToBase64String(photoByte);
             }
             ViewData["name"] = user.DisplayName;
         }
         catch (Exception)
         {
             ViewData["photo"] = null;
         }
     }
 }

Opção 2: Chamar uma API Web subsequente com a classe auxiliar

Neste cenário, adicionaste .AddDownstreamApi() em Startup.cs conforme especificado em Configuração de Código, e podes injetar diretamente um IDownstreamWebApi serviço no teu controlador ou construtor de página e utilizá-lo nas ações:

 [Authorize]
 [AuthorizeForScopes(ScopeKeySection = "TodoList:Scopes")]
 public class TodoListController : Controller
 {
     private IDownstreamWebApi _downstreamWebApi;
     private const string ServiceName = "TodoList";

     public TodoListController(IDownstreamWebApi downstreamWebApi)
     {
         _downstreamWebApi = downstreamWebApi;
     }

     public async Task<ActionResult> Details(int id)
     {
         var value = await _downstreamWebApi.CallApiForUserAsync(
             ServiceName,
             options =>
             {
                 options.RelativePath = $"me";
             });
         return View(value);
     }

O CallApiForUserAsync método também tem substituições genéricas fortemente tipadas que permitem que você receba diretamente um objeto. Por exemplo, o método seguinte recebeu uma instância Todo, que é uma representação fortemente tipada do JSON retornado pela API web.

 // GET: TodoList/Details/5
 public async Task<ActionResult> Details(int id)
 {
     var value = await _downstreamWebApi.CallApiForUserAsync<object, Todo>(
         ServiceName,
         null,
         options =>
         {
             options.HttpMethod = HttpMethod.Get;
             options.RelativePath = $"api/todolist/{id}";
         });
     return View(value);
 }

Opção 3: Chamar uma API da Web downstream sem a classe auxiliar

Se você decidiu obter um cabeçalho de autorização usando a IAuthorizationHeaderProvider interface, o código a seguir continua o código de exemplo mostrado em Uma API da Web que chama APIs da Web: Adquira um token para o aplicativo. O código é chamado nas ações dos controladores de API. Ele chama uma API downstream chamada todolist.

Depois de adquirir o token, use-o como um token de portador para chamar a API downstream.

private async Task CallTodoListService(string accessToken)
{
  // After the token has been returned by Microsoft.Identity.Web, add it to the HTTP authorization header before making the call to access the todolist service.
  authorizationHeader = await authorizationHeaderProvider.GetAuthorizationHeaderForUserAsync(scopes);
  _httpClient.DefaultRequestHeaders["Authorization"] = authorizationHeader;

  // Call the todolist service.
  HttpResponseMessage response = await _httpClient.GetAsync(TodoListBaseAddress + "/api/todolist");
  // ...
}

Próximos passos

  • Saiba mais ao criar uma aplicação web ASP.NET Core que permite iniciar sessão para os utilizadores na seguinte série de tutoriais em várias partes

  • Explore exemplos de APIs da plataforma de identidade da Microsoft para a Web