Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
На первый взгляд
Цель: Миграция на пакет SDK для Graph JS
Время: 30 минут
Плагины: Отсутствуют
Предварительные требования:настройка прокси-сервера разработки
Пакет SDK JavaScript для Microsoft Graph поставляется с функциями, которые упрощают код и позволяют сосредоточиться на создании приложения.
Использование пакета SDK упрощает следующие действия.
- Обработка ошибок API, когда что-то идет не так, как ожидалось, например, когда услуги ограничиваются из-за высокой нагрузки.
- Выполнение сложных операций API, таких как пакетные запросы
- Обработка двоичных ответов, таких как получение фотографии пользователя
Обновление с метода fetch на Graph JavaScript SDK
Если вы используете fetch API для вызова API в приложении JavaScript, возможно, у вас будет код, похожий на следующий:
const msalClient = new msal.PublicClientApplication({
auth: {
clientId: appId
}
});
function getAccessToken(msalClient) {
const accounts = msalClient.getAllAccounts();
if (accounts.length > 0) {
const accessTokenRequest = {
scopes: [
'https://graph.microsoft.com/User.Read'
],
account: accounts[0]
};
return msalClient.acquireTokenSilent(accessTokenRequest)
.then(response => response.accessToken)
.catch(error => {
console.log(error);
console.log("silent token acquisition fails. acquiring token using redirect");
if (error instanceof msal.InteractionRequiredAuthError) {
return msalClient.acquireTokenRedirect(accessTokenRequest);
}
});
}
else {
return Promise.reject('Sign in');
}
}
msalClient
.loginPopup()
.then(response => getAccessToken(msalClient))
.then(accessToken => fetch('https://graph.microsoft.com/v1.0/me', {
method: 'GET',
headers: {
authorization: `Bearer ${accessToken}`
}
}))
.then(response => response.json())
.then(json => {
// do something here
});
Чтобы использовать пакет SDK JavaScript для Graph, вы измените код следующим образом:
const msalClient = new msal.PublicClientApplication({
auth: {
clientId: appId
}
});
function getGraphClient(account) {
const authProvider = new MSGraphAuthCodeMSALBrowserAuthProvider.AuthCodeMSALBrowserAuthenticationProvider(msalClient, {
account,
scopes: [
'https://graph.microsoft.com/User.Read'
],
interactionType: msal.InteractionType.Popup,
});
return MicrosoftGraph.Client.initWithMiddleware({ authProvider });
}
msalClient
.loginPopup()
.then(response => {
const accounts = msalClient.getAllAccounts();
if (accounts.length > 0) {
const graphClient = getGraphClient(accounts[0]);
return graphClient.api('/me').get();
}
else {
return Promise.reject('Sign in');
}
})
.then(json => {
// do something here
});
Обработка ошибок API
Одна из самых распространенных ошибок API, с которыми сталкиваются приложения при масштабном использовании Microsoft Graph, — это ограничения. Это происходит, когда сервер находится под тяжелой нагрузкой. Регулирование уменьшает нагрузку на сервере, чтобы сохранить службу.
Так как регулирование редко происходит в клиентах разработчиков, часто разработчики вызывают API без правильной обработки ошибок:
fetch('https://graph.microsoft.com/v1.0/me', {
method: 'GET',
headers: {
authorization: `Bearer ${accessToken}`
}
})
.then(response => response.json())
.then(json => {
// do something here
});
Правильный способ обработки ошибок регулирования с помощью fetch API заключается в том, чтобы модифицировать вызов, обрабатывать ошибки 429 и выждать перед следующим вызовом API на количество секунд, указанное в заголовке ответа retry-after. Обновленный код будет выглядеть следующим образом:
function sleep(milliseconds) {
return new Promise((resolve) => setTimeout(resolve, milliseconds));
}
async function fetchAndRetryIfNecessary(callAPIFn) {
const response = await callAPIFn();
if (response.status === 429) {
const retryAfter = response.headers.get('retry-after');
await sleep(retryAfter * 1000);
return fetchAndRetryIfNecessary(callAPIFn);
}
return response;
}
const response = await fetchAndRetryIfNecessary(async () => (
await fetch('https://graph.microsoft.com/v1.0/me', {
method: 'GET',
headers: {
authorization: `Bearer ${accessToken}`
}
})
));
const json = await response.json();
// do something here
Более простой способ обработки ограничения скорости и других ошибок — использовать пакет SDK JavaScript Graph, который автоматически их обрабатывает.
const json = await graphClient.api('/me').get();
// do something here