Aracılığıyla paylaş


Web API'lerini çağıran bir web API'si: API çağırma

Belirteciniz olduktan sonra korumalı bir web API'sini çağırabilirsiniz. Aşağı akış API'lerini genellikle web API'nizin denetleyicisinden veya sayfalarından çağırırsınız.

Denetleyici kodu

Microsoft.Identity.Web kullandığınızda üç kullanım senaryonuz vardır:

1. Seçenek: SDK ile Microsoft Graph'ı çağırma

Bu senaryoda, Microsoft.Identity.Web.GraphServiceClient NuGet paketini eklediniz ve Kod yapılandırmasında belirtildiği gibi Startup.cs'a eklediniz .AddMicrosoftGraph() ve doğrudan eylemlerde kullanmak üzere denetleyicinize veya sayfa oluşturucunuza öğesini ekleyebilirsiniz.GraphServiceClient Aşağıdaki örnek Razor sayfasında oturum açmış kullanıcının fotoğrafı görüntülenir.

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

Seçenek 2: Yardımcı sınıfıyla aşağı akış web API'sini çağırma

Bu senaryoda, Kod yapılandırmasında belirtildiği gibi Startup.cs eklediniz .AddDownstreamApi() ve doğrudan denetleyicinize veya sayfa oluşturucunuza bir IDownstreamWebApi hizmet ekleyebilir ve eylemlerde kullanabilirsiniz:

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

yöntemi CallApiForUserAsync , doğrudan bir nesne almanıza olanak tanıyan kesin olarak belirlenmiş genel geçersiz kılmalara da sahiptir. Örneğin, aşağıdaki yöntem, web API'sinin döndürdiği JSON'un kesin olarak belirlenmiş bir gösterimi olan bir Todo örnek aldı.

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

Seçenek 3: Yardımcı sınıfı olmadan aşağı akış web API'sini çağırma

Arabirimi kullanarak IAuthorizationHeaderProvider bir yetkilendirme üst bilgisi almaya karar verdiyseniz, aşağıdaki kod Web API'lerini çağıran bir web API'sinde gösterilen örnek koda devam eder: Uygulama için belirteç alma. Kod, API denetleyicilerinin eylemlerinde çağrılır. Todolist adlı bir aşağı akış API'sini çağırır.

Belirteci aldıktan sonra, aşağı akış API'sini çağırmak için taşıyıcı belirteç olarak kullanın.

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");
  // ...
}

Sonraki adımlar