Internetowy interfejs API, który wywołuje internetowe interfejsy API: wywoływanie interfejsu API
Po utworzeniu tokenu możesz wywołać chroniony internetowy interfejs API. Zazwyczaj wywołujesz podrzędne interfejsy API z kontrolera lub stron internetowego interfejsu API.
Kod kontrolera
W przypadku korzystania z aplikacji Microsoft.Identity.Web masz trzy scenariusze użycia:
- Opcja 1. Wywoływanie programu Microsoft Graph za pomocą zestawu SDK
- Opcja 2. Wywoływanie podrzędnego internetowego interfejsu API za pomocą klasy pomocniczej
- Opcja 3. Wywoływanie podrzędnego internetowego interfejsu API bez klasy pomocniczej
Opcja 1. Wywoływanie programu Microsoft Graph za pomocą zestawu SDK
W tym scenariuszu dodano pakiet NuGet Microsoft.Identity.Web.GraphServiceClient i dodano .AddMicrosoftGraph()
go w Startup.cs zgodnie z opisem w konfiguracji kodu i można bezpośrednio wstrzyknąć GraphServiceClient
w kontrolerze lub konstruktorze strony do użycia w akcjach. Poniższa przykładowa strona Razor wyświetla zdjęcie zalogowanego użytkownika.
[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;
}
}
}
Opcja 2. Wywoływanie podrzędnego internetowego interfejsu API za pomocą klasy pomocniczej
W tym scenariuszu dodano .AddDownstreamApi()
Startup.cs, jak określono w konfiguracji kodu, i można bezpośrednio wstrzyknąć usługę IDownstreamWebApi
w kontrolerze lub konstruktorze strony i użyć jej w akcjach:
[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);
}
Metoda CallApiForUserAsync
ma również silnie typizowane przesłonięcia ogólne, które umożliwiają bezpośrednie odbieranie obiektu. Na przykład następująca metoda otrzymała wystąpienie, które jest silnie typizowaną reprezentacją Todo
kodu JSON zwróconego przez internetowy interfejs API.
// 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);
}
Opcja 3. Wywoływanie podrzędnego internetowego interfejsu API bez klasy pomocniczej
Jeśli zdecydujesz się uzyskać nagłówek autoryzacji przy użyciu interfejsu, poniższy kod kontynuuje przykładowy kod pokazany w internetowym interfejsie IAuthorizationHeaderProvider
API, który wywołuje internetowe interfejsy API: Uzyskiwanie tokenu dla aplikacji. Kod jest wywoływany w akcjach kontrolerów interfejsu API. Wywołuje ona podrzędny interfejs API o nazwie todolist.
Po uzyskaniu tokenu użyj go jako tokenu elementu nośnego, aby wywołać podrzędny interfejs API.
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");
// ...
}