Створення запитів HTTP і обробка помилок для веб-API порталів
Взаємодія із API веб-служб передбачає побудову HTTP-запитів із необхідними заголовками, а також обробку HTTP-відповідей, зокрема будь-яких помилок.
Важливо
- Для роботи цієї функції необхідно, щоб версія порталу була 9.3.3.x або вище.
URL-адреса API веб-служб та робота із версіями
Створіть URL-адресу API веб-служб, використовуючи формат у таблиці нижче.
Частина | Опис |
---|---|
Протокол | https:// |
Основна URL-адреса | <URL-адреса порталу> |
Шлях до API веб-служб | _api |
Ресурс | Логічне ім'я таблиці, яку потрібно використати |
Наприклад, для посилання на інцидент використовуйте наведений нижче формат.
https://contoso.powerappsportals.com/_api/case
Усі ресурси API веб-служб будуть дотримуватися відповідних дозволів таблиць у контексті веб-ролей.
Методи HTTP
HTTP-запити можуть використовувати різні види методів Однак API веб-служб порталів підтримує лише методи, наведені в цій таблиці:
Спосіб зв’язку | Використання |
---|---|
Get | Використовується для отримання даних із таблиць. |
Після | Використовуйте при створенні записів. |
Patch | Використовується для оновлення таблиць або операцій без додаткової інформації. |
Delete | Використовуйте для видалення записів або значень окремих полів записів. |
Put | Використовуйте лише в деяких ситуаціях для оновлення окремих полів записів. |
Заголовки HTTP
API веб-служб підтримує лише JSON. Кожен заголовок HTTP повинен містити зазначені нижче елементи.
- Значення заголовка Прийняти — application/json, навіть якщо основний текст відповіді не очікується.
- Якщо у тексті запиту містяться дані JSON, необхідно додати заголовок Content-Type із значенням
application/json
.
Поточна версія OData — 4.0, але майбутні версії можуть пропонувати нові можливості. Використовуйте синтаксис нижче, щоб забезпечити відсутність двозначності щодо версії OData, яка буде застосована до коду в майбутньому.
Синтаксис
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Приклад: функція AJAX оболонки для маркера CSRF
(function(webapi, $){
function safeAjax(ajaxOptions) {
var deferredAjax = $.Deferred();
shell.getTokenDeferred().done(function (token) {
// add headers for ajax
if (!ajaxOptions.headers) {
$.extend(ajaxOptions, {
headers: {
"__RequestVerificationToken": token
}
});
} else {
ajaxOptions.headers["__RequestVerificationToken"] = token;
}
$.ajax(ajaxOptions)
.done(function(data, textStatus, jqXHR) {
validateLoginSession(data, textStatus, jqXHR, deferredAjax.resolve);
}).fail(deferredAjax.reject); //ajax
}).fail(function () {
deferredAjax.rejectWith(this, arguments); // on token failure, pass the token ajax and args
});
return deferredAjax.promise();
}
webapi.safeAjax = safeAjax;
})(window.webapi = window.webapi || {}, jQuery)
Приклад: отримання даних таблиці
webapi.safeAjax({
type: "GET",
url: "/_api/contacts?$select=firstname,lastname",
contentType: "application/json",
success: function (res) {
console.log(res);
}
});
Приклад: створення даних таблиці
webapi.safeAjax({
type: "POST",
url: "/_api/accounts",
contentType: "application/json",
data: JSON.stringify({
"name": "Sample Account"
}),
success: function (res, status, xhr) {
console.log("entityID: "+ xhr.getResponseHeader("entityid"))
}
});
Приклад: оновлення даних таблиці
webapi.safeAjax({
type: "PATCH",
url: "/_api/accounts(00000000-0000-0000-0000-000000000001)",
contentType: "application/json",
data: JSON.stringify({
"name": "Sample Account - Updated"
}),
success: function (res) {
console.log(res);
}
});
Приклад: видалення даних таблиці
webapi.safeAjax({
type: "DELETE",
url: "/_api/accounts(00000000-0000-0000-0000-000000000001)",
contentType: "application/json",
success: function (res) {
console.log(res);
}
});
Визначення кодів станів
Кожна відповідь на HTTP-запит містить код стану. Коди станів, що повертаються API веб-служб порталів, наведено нижче.
Код | Опис | Ввести |
---|---|---|
200 OK | Ця відповідь є очікуваною, якщо ваша операція повертатиме дані у тексті відповіді. | Успіх |
204 No Content | Ця відповідь є очікуваною, якщо ваша операція успішно виконана, але не повертає даних у тексті відповіді. | Успіх |
403 Заборонено | Ця відповідь надходить, якщо виникає помилка, що належить до одного з перелічених типів.
|
Помилка клієнта |
401 Не авторизовано | Ця відповідь надходить, якщо виникає помилка, що належить до одного з перелічених типів.
|
Помилка клієнта |
413 Payload Too Large | Ця відповідь надходить, якщо довжина запиту завелика. | Помилка клієнта |
400 BadRequest | Ця відповідь надходить, якщо аргумент є неприпустимим. InvalidAttribute |
Помилка клієнта |
404 Not Found | Очікуйте цю відповідь, коли ресурс не існує. Таблиця не доступна для Web API. |
Помилка клієнта |
405 Method Not Allowed | Ця помилка виникає, якщо використовується неприпустима комбінація методу та ресурсу. Наприклад, не можна використовувати DELETE або PATCH для колекцій таблиць. Така ситуація може виникати для перелічених нижче типів помилок.
|
Помилка клієнта |
501 Not Implemented | Ця відповідь надходить, якщо якусь з операцій, згадану у запиті, не реалізовано. | Помилка сервера |
503 Служба недоступна | Очікуйте цю відповідь, коли послуга API веб-служб недоступна. | Помилка сервера |
Розбір помилок у відповіді
Розгляньте наведений далі приклад відповіді HTTP, у якому все ще міститься внутрішня помилка.
{
"error":{
"code": "This code is not related to the http status code and is frequently empty",
"message": "A message describing the error",
"cdscode": "Dataverse error code",
"innererror": {
"code": "800xxxx",
"message": "A message describing the error. This is frequently the same as the outer message.."
}
}
}
Коди помилок
Коди помилок відображаються у шістнадцятковому форматі для усіх підтримуваних сценаріїв. У таблиці нижче перелічено кожен код помилки з відповідною назвою та повідомленням.
Код помилки | Назва помилки | Повідомлення про помилку |
---|---|---|
900400FF | NoAttributesForEntityCreate | Немає атрибутів для дії "Створити таблицю". |
90040100 | InvalidAttribute | Не вдалося знайти атрибут {0} для таблиці {1}. |
90040101 | AttributePermissionIsMissing | Атрибут {0} у таблиці {1} не ввімкнуто для API веб-служб. |
90040102 | TablePermissionWriteIsMissingDuringUpdate | Бракує дозволу на оновлення сутності {0}. |
90040103 | TablePermissionCreateIsMissing | Бракує дозволу на створення сутності {0}. |
90040104 | TablePermissionDeleteIsMissing | Бракує дозволу на видалення сутності {0}. |
90040105 | TablePermissionAppendIsMissngDuringAssociationChange | Бракує дозволу на зв’язування таблиці {0} з {1} або скасування зв’язку між цими об’єктами. |
90040106 | TablePermissionAppendToIsMissingDuringAssociationChange | Бракує дозволу на зв’язування таблиці {1} з {0} або скасування зв’язку між цими об’єктами. |
90040107 | HttpAntiForgeryException | Маркер cookie антифальсифікації та маркер поля форми не співпадають. |
90040109 | MissingPortalSessionCookie | Неприпустимий маркер сеансу був переданий викидаючому методу. |
9004010C | ResourceDoesNotExists | Не вдалося знайти ресурс для сегмента '{0}'. |
9004010D | CDSError | Сталася помилка CDS. |
Відповідь на необроблені помилки з кодом стану HTTP 500 повертатиме помилку «Виникла непередбачувана помилка під час обробки запиту».