Як створити REST URL без дієслів?


283

Я намагаюся визначити, як створити спокійні URL-адреси. Я все за спокійний підхід використання URL-адрес із іменниками, а не дієсловами, не розумію, як це зробити.

Ми створюємо сервіс для впровадження фінансового калькулятора. Калькулятор приймає купу параметрів, які ми будемо завантажувати через файл CSV. Випадки використання:

  1. Завантажте нові параметри
  2. Отримайте останні параметри
  3. Отримати параметри для заданої дати бізнесу
  4. Зробіть набір параметрів активним
  5. Підтвердити набір параметрів

Я думаю, що спокійним підходом було б мати такі типи URL-адрес:

/parameters
/parameters/12-23-2009

Перші три випадки використання можна досягти за допомогою:

  1. POST, де ви включаєте файл параметра у запиті на публікацію
  2. Отримайте першу URL-адресу
  3. Отримайте другу URL-адресу

Але як ви робите відмінок 4-го та 5-го вживання без дієслова? Чи не потрібні вам такі URL-адреси, як:

/parameters/ID/activate
/parameters/ID/validate

??


3
Я віддаю перевагу PATCH, а не POST для часткового оновлення.
користувач2016971

Відповіді:


71

Можливо, щось на кшталт:

PUT /parameters/activation HTTP/1.1
Content-Type: application/json; encoding=UTF-8
Content-Length: 18

{ "active": true }

1
POSTГаразд, якщо вам потрібно виконати "процедуру", наприклад перевірку параметрів щоразу, коли ви надсилаєте запит. Але коли ви змінюєте стан (програми) ресурсу, ви фактично оновлюєте існуючий ресурс, а не створюєте якийсь новий ресурс або не публікуєте запит на обробку.
Андрій Власовських

19
PUT - це створення нового ресурсу або розміщення (загалом, не частково) нового ресурсу за певною URL-адресою. Я не бачу, як PUT відповідає цій справі.
Бретон

30
На насправді, POSTпроти PUTне так же , як insertпроти update. PUTоновлює ресурс, відповідний даному шляху, або створює новий ресурс, відповідний даному шляху. POSTстворює десь новий ресурс. Наприклад, PUT /blog/posts/3/comments/5оновить відповідний коментар, в той час як POST /blog/posts/3/commentsстворить новий commentресурс (і повинен повернути шлях у новий ресурс у відповіді).
yfeldblum

23
@Justice @Breton Більш важлива відмінність полягає в тому, що PUTidempotent поки POSTне є. Зазвичай слід поставити якомога більше обмежень щодо того, що ви надаєте якнайбільше результатів. Якщо дотримуватися, PUTнадає більше інформації клієнту послуги.
Андрій Власовських

3
Ресурс також міг бути / параметри / статус, і тіло запиту могло бути просто "активним". Таким чином ви якось розміщуєте цілий новий ресурс до певної URL-адреси.
Карлос Агуайо

991

Загальні принципи хорошого дизайну URI:

  • Не використовуйте параметри запиту для зміни стану
  • Не використовуйте змішані регістри шляхів, якщо можете допомогти; Малі літери найкраще
  • Не використовуйте розширення для URI у своїх URI (.php, .py, .pl тощо)
  • Не впадайте в RPC за допомогою URI
  • Як обмежити URI простору якомога більше
  • Зробіть, щоб сегменти шляху були короткими
  • Ви віддаєте перевагу /resourceабо /resource/; створити 301 переадресацію з тієї, яку ви не використовуєте
  • Чи є параметри використання запиту для суб-вибору ресурсу; тобто сторінки, пошукові запити
  • Do хід речі з URI , який повинен бути в тілі HTTP заголовка або

(Примітка. Я не сказав "RESTful URI design"; URI в основному непрозорі в REST.)

Загальні принципи вибору методу HTTP:

  • Ніколи не використовуйте GET для зміни стану; це чудовий спосіб змусити Googlebot зіпсувати ваш день
  • Не використовуйте PUT, якщо ви не оновлюєте весь ресурс
  • Не використовуйте PUT, якщо ви також не зможете законно зробити GET на тому ж URI
  • Не використовуйте POST для отримання довготривалої інформації, яка може бути доцільною для кешування
  • Не виконуйте операцію, яка не є ідентичною з PUT
  • Чи є використовувати GET для якомога більше
  • Чи є використовувати POST в перевазі до PUT , якщо сумніваєтеся
  • Чи є використовувати POST , коли ви повинні зробити що - то , що відчуває RPC-як
  • Чи є використовувати PUT для класів ресурсів, які більше або ієрархічна
  • Як ВИДАЛИТИ використання в перевазі до POST для видалення ресурсів
  • Do використовувати GET для речей , як розрахунки, якщо ваш вклад не великий, в цьому випадку використання POST

Загальні принципи дизайну веб-сервісу за допомогою HTTP:

  • Не вводьте метадані в тій частині відповіді, яка має бути в заголовку
  • Не ставте метадані в окремий ресурс, якщо включення цього не призведе до значних витрат
  • Є чи використовувати відповідний код стану
    • 201 Createdпісля створення ресурсу; ресурс повинен існувати в момент надсилання відповіді
    • 202 Accepted після успішного виконання операції або створення асинхронного ресурсу
    • 400 Bad Requestколи хтось робить операцію над даними, які явно нечіткі; для вашої програми це може бути помилка перевірки; як правило, резерв 500 для винятків, що не підлягають перешкодам
    • 401 Unauthorizedколи хтось отримує доступ до вашого API або не надаючи необхідний Authorizationзаголовок, або коли дані в межах Authorizationнедійсні; не використовуйте цей код відповіді, якщо ви не очікуєте облікових даних через Authorizationзаголовок.
    • 403 Forbidden коли хтось звертається до вашого API таким чином, що може бути шкідливим або якщо він не має дозволу
    • 405 Method Not Allowed коли хтось використовує POST, коли він повинен був використовувати PUT тощо
    • 413 Request Entity Too Large коли хтось намагається надіслати вам неприйнятно великий файл
    • 418 I'm a teapot при спробі заварити каву за допомогою чайника
  • Чи є використання заголовків кешування , коли ви можете
    • ETag заголовки хороші, коли ви можете легко зменшити ресурс до хеш-значення
    • Last-Modified Вам слід вказати на те, що добре орієнтуватися на часові позначення часу оновлення ресурсів
    • Cache-Controlі Expiresслід надати розумні значення
  • Зробіть усе можливе, щоб вшанувати кешування заголовків у запиті ( If-None-Modified, If-Modified-Since)
  • Do переадресовує використовувати , коли вони мають сенс, але вони повинні бути рідкісними для веб - служби

Що стосується вашого конкретного питання, POST слід використовувати для №4 та №5. Ці операції підпадають під "RPC-подібне" керівництво вище. Для №5 пам’ятайте, що POST не обов’язково використовувати Content-Type: application/x-www-form-urlencoded. Це так само легко може бути корисним навантаженням JSON або CSV.


11
413 призначений для розміру запиту, який ви надсилаєте, щоб ви могли ввічливо відхилити, хтось надсилає вам гіги даних, часто в поєднанні з 411, тому ви змушуєте людей говорити вам, скільки відправляється. Для прикладу, поданого проти 413, я вважаю, що 400 було б більш правильною відповіддю.
Гаррі Шутлер

5
+1, оскільки це чудовий ресурс. Однак це загальний ресурс і не відповідає безпосередньо питанням. Це в ідеалі має містити додатковий абзац із конкретною відповіддю.
Самуель Нефф

@GarryShutler Добрий улов, ти абсолютно прав. Дякуємо за редагування
Боб Аман

1
Так, ви використовуєте PUT лише в тих випадках, коли ви перезаписуєте весь об'єкт. Однак я б стверджував, що або PATCH, або POST є розумними у випадку часткового оновлення ресурсу. PATCH є більш зрозумілим з точки зору того, що операція буде робити, але оскільки не всі клієнти навіть здатні надати запит PATCH , цілком доречно дозволити POST замість цього, і я можу навіть зайти так далеко, щоб заперечити, що POST завжди повинен бути дозволений як резервний, якщо використовується PATCH .
Боб Аман

1
+1 за 409 помилок. Помилка 400 - це те, що можна усунути шляхом достатньої перевірки на стороні клієнта. 409 уточнює, що сам запит був прийнятним і послідовним, але конфліктує з деяким аспектом стану сервера (як правило, управління паралельною валютою, але теоретично будь-яке обмеження, яке не вводиться).
claytond

18

Щоразу, коли це виглядає, що вам потрібно нове дієслово, подумайте про те, щоб перетворити це дієслово на іменник. Наприклад, перетворіть "активувати" на "активацію", а "підтвердити" - на "перевірку".

Але тільки з того, що ви написали, я б сказав, що у вашої заяви є набагато більші проблеми.

Щоразу, коли буде запропонований ресурс під назвою "параметр", він повинен надсилати червоні прапори в голову кожного члена проектної групи 'параметр' може буквально застосовуватися до будь-якого ресурсу; це недостатньо конкретно.

Що саме означає "параметр"? Напевно, ціла низка різних речей, кожна з яких повинна мати окремий ресурс, присвячений їй.

Ще один спосіб досягти цього - коли ви обговорюєте свою програму з кінцевими користувачами (тими, хто, мабуть, мало знає про програмування), які слова вони самі неодноразово використовують?

Це слова, якими ви повинні розробляти свою програму.

Якщо ви ще не провели цю конверсію з потенційними користувачами - зупиніть усе зараз і не пишіть інший рядок коду, поки ви цього не зробите! Тільки тоді ваша команда матиме уявлення про те, що потрібно будувати.

Я нічого не знаю про фінансове програмне забезпечення, але якби мені довелося здогадатися, я б сказав, що деякі ресурси можуть бути названі такими як "Звіт", "Оплата", "Переказ" та "Валюта".

Про цю частину процесу розробки програмного забезпечення існує низка хороших книг. Два, які я можу порекомендувати, - це моделі дизайну та аналізу, керовані доменом .


1
Це дійсно вдалий момент. Це легко пропустити, якщо ви в стані душі для обробки формальної логіки та міркувань. Не має значення, що таке Х, якщо він дійсно поєднується з іншими частинами. Людські фактори просто вислизають.
Бретон

1
Іноді мені здається корисним перетворити слова в "ресурс обробки", наприклад "активатор" або "валідатор". Відповідно до RFC 2616 POST можна використовувати для "Надання блоку даних ... до процесу обробки даних"
Darrel Miller

Зрозумів. У цьому випадку користувачі позначають дані як "параметри" (або "параметри ризику" або щось подібне). Список параметрів містить багато різних типів налаштувань, але параметри завжди завантажуються як цілий набір (у файл CSV).
Маркус Леон

@Marcus - це звучить як дуже незвичний випадок. Можливо, якщо ви пояснили, що робить ваш додаток більш детально, ми зможемо запропонувати кращі пропозиції щодо визначення ресурсів.
Багатий Аподака

1
"коли ви обговорюєте свою програму з кінцевими користувачами, які слова вони самі неодноразово використовують?" ... а що робити, якщо вони всі дієслова? XD
Амальговінус

11

Дизайн ваших URL-адрес не має нічого спільного з тим, чи є ваша програма RESTful чи ні. Таким чином, фраза "RESTful URL-адреси" є нісенітницею.

Я думаю, вам слід ще трохи прочитати, що таке REST насправді. REST трактує URL-адреси як непрозорі, і як такий не знає, що в них є, чи є дієслова чи іменники чи інше. Ви все ще можете розробити свої URL-адреси, але це стосується інтерфейсу користувача, а не REST.

З цього приводу, давайте перейдемо до вашого запитання: Два останніх випадки не є ВИПУСКІМ і не вписуються в будь-яку спокійну схему. Це те, що можна назвати RPC. Якщо ви серйозно ставитесь до програми REST, вам доведеться переосмислити, як працює ваша програма з нуля. Або це або відмовтесь від REST і просто зробіть свою програму як додаток RPC.

Хрммм, може, ні.

Ідея тут полягає в тому, що ви повинні ставитися до всього як до ресурсу, тож як тільки набір параметрів має URL-адресу, звідки ви можете посилатися на нього, просто додайте:

GET [parametersurl]/validationresults

POST [paramatersurl]
body: {command:"activate"}

Але знову ж таки, що активувати річ - RPC, а не REST.


Тут ви заявляєте цікавий момент. Чи можете ви детальніше розібратися, яким би був RESTful підхід до подібного?
poezn

Я витратив трохи часу на читання відповідей тут, і я думаю, що справедливість може бути на чомусь. він моделює окремі властивості об'єкта ваших параметрів як окремі ресурси та використовує дієслово PUT для заміни вмісту цього властивості на цьому ресурсі. Це моделювання стану кожного об'єкта як сукупності ресурсів та модифікація стану як розміщення, вилучення чи модифікація ресурсу. Що стосується перевірки - Вам просто потрібен ресурс, який магічно визначає, чи є параметри дійсними чи ні, як зазначено вище в моїй відповіді. Це було б добре, доки це не має побічних ефектів.
Бретон

Зрозуміло, що те, що робить "Активувати", - це лише встановити єдине властивість на істинне. Якщо він повинен робити щось інше, то він все ще не ВИПУСКОВИЙ, і я не впевнений, як би ви його моделювали RESTfully.
Бретон

Я не думаю, що ти можеш сказати, що останні два випадки не є ВЕЛИКИМИ. Насправді активація та перевірка - це лише непрямі способи сказати, що ресурс змінюється на новий стан у машині стану. REST цілком здатний моделювати це.
Даррел Міллер

@Darrel, я думаю, ви вказали на частину REST, яка може бути складною для багатьох людей, які не знайомі з REST. Як ви можете зайнятися реалізацією операції "Перевірити ресурс х"? Я думаю, що складним є те, що це операція, яка може призвести до зміни стану, але новий стан є результатом запиту.
Шон

6

Вимоги до активації та перевірки - це ситуації, коли ви намагаєтесь змінити стан ресурсу. Не відрізняється тим, що оформлення замовлення "виконано" або якийсь інший запит "подано". Існує чимало способів моделювання подібних змін змін у державі, але, як я вважаю, що часто працює, це створити ресурси збору ресурсів тієї самої держави, а потім перемістити ресурс між колекціями, щоб вплинути на стан.

наприклад, створити деякі ресурси, такі як,

/ActiveParameters
/ValidatedParameters

Якщо ви хочете зробити набір параметрів активним, додайте цей набір до колекції ActiveParameters. Ви можете або передавати набір параметрів як орган сутності, або ви можете передати URL-адресу як параметр запиту таким чином:

POST /ActiveParameters?parameter=/Parameters/{Id}

Те саме можна зробити з / ValidedParameters. Якщо Параметри недійсні, то сервер може повернути "Поганий запит" на запит про додавання параметрів до колекції перевірених параметрів.


1

Я б запропонував наступні метаресурси та методи.

Зробіть параметри активними та / або підтвердіть їх:

> PUT /parameters/<id>/meta HTTP/1.1
> Host: example.com
> Content-Type: application/json
> Connection: close
>
> {'active': true, 'require-valid': true}
>
< HTTP/1.1 200 OK
< Connection: close
<

Перевірте, чи параметри активні та дійсні:

> GET /parameters/<id>/meta HTTP/1.1
> Host: example.com
> Connection: close
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Connection: close
<
< {
<     'active': true,
<     'require-valid': true,
<     'valid': {'status': false, 'reason': '...'}
< }
<

Наскільки я розумію, питання стосується називання спокійних URL-адрес, а не функціональності, чи не так?
poezn

2
Питання, приурочене до "RESTful URL-адрес", є поганим питанням, і на нього не слід відповідати. Натомість питання слід розширити, щоб розглянути "RESTful ресурси, із пов'язаними методами та URL-адресами" - і відповісти як таке.
yfeldblum

Як я зрозумів, питання стосувалося умов узгодження імен URL та методів HTTP, на які повинен відповідати названий ресурс.
Андрій Власовських

1

Мені трохи сумно бачити, що після більш ніж 10 років відповіді насправді не зазначено, як таке, що вимагається в ОП, може бути розроблено в архітектурі REST, отже, я відчуваю необхідність зробити це зараз.

Перш за все, що таке REST ?! Скорочення REST або ReST означає "Передача представницького стану" та визначає обмін станом ресурсу у певному форматі представлення. Формат представлення відповідає типу узгоджених засобів масової інформації. У випадку application/htmlформату представлення може бути потік текстового вмісту, відформатованого HTML, який відображається у браузері, ймовірно, після застосування певного форматування таблиці стилів для розміщення певних елементів у певних місцях.

REST - це, в принципі, узагальнення веб-переглядачів, про які ми всі знаємо, хоча націлені на всі види програм та не лише браузери. Тому, задумуючи, ті самі поняття, які застосовуються до Інтернету, застосовуються і до архітектури REST. Таке питання, як досягти чогось "RESTful" способом, вирішується навколо відповіді на питання, як чогось досягти на веб-сторінці, а потім застосувати ті самі поняття до рівня додатків.

Веб-калькулятор зазвичай може починатися з якоїсь "сторінки", яка дозволяє вводити деякі значення для обчислення, перш ніж надсилати введені дані на сервер. У HTML це зазвичай досягається за допомогою <form>елементів HTML, які навчають клієнта встановити доступні параметри, цільове місце для відправки запиту, а також формат представлення, який слід застосувати після надсилання вхідних даних. Це може виглядати приблизно так:

<html>
  <head>
    ...
  </head>
  <body>
    <form action="/../someResource" method="post" enctype="application/x-www-form-urlencoded">
      <label for="firstNumber">First number:</label>
      <input type="number" id="firstNumber" name="firstNumber"/>

      <label for="secondNumber">Second number:</label>
      <input type="number" id="secondNumber" name="secondNumber"/>

      <input type="submit" value="Add numbers"/>
    </form>
  </body>
</html>

Наведений вище зразок, тобто стверджує, що є два поля введення, які можна заповнити або користувачем, або іншими автоматами, і що після виклику вхідного елемента введення браузер дбає про форматування вхідних даних у application/x-www-form-urlencodedформат подання, який надсилається до вказаного цільового місця через вказаний метод запиту HTTP, POSTу цьому випадку. Якщо ми введемо 1у firstNumberполе введення та 2у secondNumberполе введення, браузер сформує представлення firstNumber=1&secondNumber=2та надішле це як корисне навантаження фактичного запиту на цільовий ресурс.

Отже, необроблений запит HTTP, виданий серверу, може виглядати так:

POST /../someResource
Host: www.acme.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 28
Accept: application/html

firstNumber=1&secondNumber=2

Сервер може виконати обчислення та відповісти на подальшій HTML-сторінці, яка містить результат обчислення, оскільки в запиті було вказано, що клієнт розуміє цей формат.

Як вже зазначав Бретон, немає такого поняття, як "RESTful" URL або URI. URI / URL - це щось подібне, і воно не повинно передати жодному значенню клієнту / користувачеві. У зразку калькулятора вище користувача просто не цікавить, куди надсилати дані, просто цікавить те, що при запуску поля введення введення запит надсилається. Вся необхідна інформація, необхідна для виконання завдання, повинна бути надана сервером.

Також веб-переглядач може не знати про те, що запит насправді подає калькулятор з деякими вхідними параметрами, а також може бути якась форма замовлення, яка повертає лише наступне подання форми для продовження процесу замовлення або якийсь зовсім інший вид ресурс. Він просто виконує те, що вимагає специфікація HTML в такому випадку, і не може менше турбуватися, що насправді робить сервер. Ця концепція дозволяє веб-переглядачу використовувати той самий формат представлення, щоб робити всілякі речі, такі як замовлення деяких речей з улюбленого інтернет-магазину, спілкування в чаті з кращими друзями, вхід в онлайн-акаунт тощо.

Affordance деяких елементів, наприклад в разі введення уявити поле, яке зазвичай перекладається як кнопка, визначає те , що ви повинні , щоб з ним. Що стосується кнопки чи посилання, то вона, як правило, говорить вам про її натискання. Інші елементи можуть містити різні переваги. Така приналежність може бути виражена також через зв'язки , наприклад, з preloadанотованими посиланнями, які в основному говорять клієнту, що він вже може завантажувати вміст пов'язаного ресурсу у фоновому режимі, оскільки користувач, швидше за все, захопить цей контент далі. Такі відносини зв’язків, звичайно, повинні бути стандартизовані або слідувати механізму розширення для типів відносин, визначених веб- зв'язком .

Це основна концепція, яка використовується в Інтернеті і яка також повинна використовуватися в архітектурі REST. За словами "дядька Боба" Роберта К. Мартіна , архітектура полягає в намірі, а задумом архітектури REST є від'єднання клієнтів від серверів, щоб сервери могли вільно розвиватися в майбутньому, не боячись їх зламати клієнтів. Це, на жаль, вимагає великої дисципліни, оскільки так легко запровадити з'єднання або додати швидкі рішення, щоб виконати роботу та продовжувати роботу. Як вказував Джим Вебер в архітектурі REST, ви, як постачальник послуг, повинні намагатися розробити протокол додатків домену, подібний текстовій комп'ютерній грі 70-х років, за якою дотримуватимуться клієнти, поки вони не закінчать процес.

На жаль, багато так званих API "REST" насправді - це все, окрім цього. Ви бачите обмін даними на базі JSON, які визначені в специфічній зовнішній документації API, яку, як правило, важко динамічно інтегрувати. Формат, яким повинен виглядати запит, також жорстко кодується у зовнішній документації, що призводить до безлічі впровадження інтерпретації URI для повернення попередньо визначених типівзамість того, щоб використовувати якийсь загальний формат представлення, який узгоджується заздалегідь. Це не дозволяє серверам змінюватися, оскільки клієнти тепер очікують отримання певного формату даних (зверніть увагу, не формат подання!) Для попередньо визначених URI. Цей власний обмін форматом даних також запобігає взаємодії клієнтів з іншими API, оскільки "формат даних" зазвичай припливає до конкретного API. Ми знаємо цю концепцію з минулих часів із технологій RPC, таких як Corba, RMI або SOAP, які ми засуджуємо як якось злі, навіть якщо Peppol перейшов до неї знову, замінивши AS2 на AS4 як протокол передачі за замовчуванням, як нещодавно.

Що стосується власне заданого питання, передача даних у форматі CSV - це не що інше, як використання application/x-www-form-urlencodedпредставлення чи подібних матеріалів. Джим Вебер дав зрозуміти, що врешті-решт HTTP - це лише транспортний протокол, домен додатка якого - передача документів через Інтернет . Клієнт і сервер повинні принаймні обидва підтримувати, text/csvяк визначено в RFC 7111 . Цей файл CSV може бути згенерований як наслідок обробки типу носія, який визначає елементи форми, цільовий елемент або атрибут для надсилання запиту, а також метод HTTP для завантаження конфігурації.

Існує кілька типів медіа, які підтримують такі форми, як HTML , HAL Forms , півформа , іон або гідра . На даний момент я не знаю типу носія, який автоматично може кодувати вхідні дані text/csvбезпосередньо, отже, можливо, потрібно буде визначити і зареєструвати в реєстрі засобів масової інформації IANA .

Гадаю, завантаження та завантаження всього набору параметрів не повинно бути проблемою. Як було сказано раніше, цільовий URI не має значення, оскільки клієнт просто використовуватиме URI для отримання нового вмісту для обробки. Фільтрування за датою роботи також не повинно скласти труднощів. Однак тут сервер повинен клієнт з усіма можливостями, які клієнт може просто вибрати. В останні роки розвивалися GraphQL і RestQL, які вводять мову, подібну SQL, яка може бути націлена на певну кінцеву точку, щоб отримати відфільтрований відповідь. Однак у справжньому сенсі REST це порушує ідею, що стоїть за REST як а) GraphQL, тобто використовує лише єдину кінцеву точку, яка певним чином перешкоджає оптимальному використанню кешування, і b) вимагає знань про доступні поля вперед, що може призвести до введення зв'язку клієнтів до базової моделі даних ресурсу.

Активізація або деактивація певних параметрів конфігурації - це просто питання запуску гіпермедіа-елементів керування, які забезпечують це. У формах HTML це може бути проста прапорець або багаторядковий вибір у списку чи іншого виду. Залежно від форми та методу, який він визначає, він може потенційно надіслати всю конфігурацію через PUTабо бути розумним щодо зроблених змін та виконати лише часткове оновлення через PATCH. Останнє вимагає, в основному, калькулятор подання змін до оновленого та подає сервер з необхідними кроками для перетворення поточного представлення в потрібне. Відповідно до специфікації PATH, це повинно бути виконано в рамках транзакції, так що застосовуються всі або жоден з кроків.

HTTP дозволяє та заохочує сервер попередньо перевірити отриманий запит перед застосуванням змін. Для PUT специфікація говорить:

Сервер-джерело ПОТРІБНО перевірити, чи представлення PUT відповідає будь-яким обмеженням, які має сервер для цільового ресурсу, які не можуть або не можуть бути змінені PUT. Це особливо важливо, коли сервер-джерело використовує внутрішню інформацію про конфігурацію, пов'язану з URI, щоб встановити значення для метаданих представлення в GET-відповідях. Якщо представлення PUT суперечить цільовому ресурсу, сервер-джерело ДОЛЖЕН би або зробити їх послідовними, трансформуючи представлення або змінивши конфігурацію ресурсу, або відповісти відповідним повідомленням про помилку, що містить достатню інформацію, щоб пояснити, чому представлення непридатне. Запропоновано коди статусу 409 (конфлікт) або 415 (непідтримуваний тип медіа),

Наприклад, якщо цільовий ресурс налаштований завжди мати тип вмісту "text / html", а представлення, яке PUT, має тип вмісту "image / jpeg", сервер-джерело повинен виконати один із:

а. перенастройте цільовий ресурс для відображення нового типу медіа;

б. перетворити представлення PUT у формат, відповідний формату ресурсу, перш ніж зберегти його як новий стан ресурсу; або,

c. відхиліть запит з відповіддю 415 (Непідтримуваний тип медіа), що вказує, що цільовий ресурс обмежений "текстом / html", можливо, включає посилання на інший ресурс, який був би придатною ціллю для нового представлення.

HTTP не визначає, як саме метод PUT впливає на стан початкового сервера, що перевищує те, що може бути виражено наміром запиту агента користувача та семантикою відповіді сервера-джерела. ...

Для підведення підсумків цієї публікації слід або використовувати наявний тип носія, який дозволяє навчити клієнта необхідним або підтримуваним вхідним параметрам, цільовому розташуванню, на яке потрібно відправити запит, операції, яку потрібно використовувати, а також введіть носій запит має бути відформатований або визначити свій власний, який ви реєструєте в IANA. Останнє може знадобитися, якщо ви хочете перетворити вхідtext/csvа потім завантажте представлення CSV на сервер. Перевірка повинна відбутися до того, як зміни будуть застосовані до ресурсу. Фактичний URI не повинен мати значення для клієнтів, крім того, щоб визначити, куди надсилати запит, і, як такий, можна вільно обирати вас, виконавця послуги. Виконуючи ці кроки, ви в значній мірі отримуєте свободу змінювати свою сторону сервера в будь-який час, і клієнти не будуть ламатися як наслідок, якщо вони підтримують використовувані типи медіа.


0

Редагувати: Дійсно, URI заважав би GETзапитам залишатись ідентичними.


Для перевірки, однак, використання кодів статусу HTTP для повідомлення про дійсність запиту (для створення нового або зміни існуючого "параметра") відповідатиме моделі Restful.

Повідомте назад з 400 Bad Requestкодом статусу, якщо надані дані є / недійсними і запит потрібно змінити перед повторним надсиланням ( коди статусу HTTP / 1.1 ).

Це покладається на перевірку під час подання, а не на відстрочку, як у вашому випадку використання. Інші відповіді мають відповідне рішення для цього сценарію.


URI призначений для ідентифікатора. Використання певної URL-адреси не повинно мати побічних ефектів. Уявіть, що з цим зробив би проксі.
Бретон

2
або Google, з цього приводу. Одного разу я прочитав історію про веб-магазин, який через Google видалив усі їхні продукти через таку ідіотичність.
Бретон

0

У середовищі REST кожна URL-адреса є унікальним ресурсом. Які ваші ресурси? Фінансовий калькулятор насправді не має очевидних ресурсів. Потрібно розкопатися в тому, що ви викликаєте параметри і витягнути ресурси. Наприклад, календар амортизації позики може бути ресурсом. URL-адреса календаря може включати дату початку, термін (у місяцях чи роках), період (коли відсотки складаються), процентну ставку та початковий принцип. З урахуванням усіх цих цінностей у вас є конкретний календар платежів:

http://example.com/amort_cal/2009-10-20/30yrsfixed/monthly/5.00/200000

Тепер я не знаю, що ви обчислюєте, але ваша концепція списку параметрів не звучить НАЙКРАЩО. Як хтось сказав, ваші вимоги вище звучать XMLRPC. Якщо ви намагаєтесь REST, вам потрібні іменники. Обчислення не є іменниками, це дієслова, які діють на іменники. Потрібно перевернути його, щоб витягнути іменники зі свого обчислення.


5
Я думаю, що тут трохи нерозумно використовувати нахилені косої риси, що було б неправильно з amort_cal? Date = 2009-10-20 & type = 30yrsfixed & period = Щомісяця & rate = 5.0 & Initilamount = 200000? REST не хвилює, поки це ресурс. Спеціалізація URI все ж піклується. Як ви уявляєте відносні зв’язки для роботи із такою схемою?
Бретон

Ти незважаєш на це хороший момент. Ці "параметри" навіть потрібно зберігати на сервері? Якщо це лише разовий розрахунок, чому б просто не зробити віртуальний простір, де параметри знаходяться в URL-адресі. Поки ви не змінюєте внутрішній стан, це повинно бути добре.
Бретон

1
І "параметри" не застосовуються до "ресурсу". Ресурс - це єдине ціле з унікальним ідентифікатором. Моя URL-адреса визначає єдиний ресурс. Параметризована URL-адреса вказує на сукупність ресурсів, які ви вибираєте серед параметрів.
jmucchiello

2
REST не базується на "ресурсах CRUDing". Якщо додати всі ваші параметри запиту до сегментів шляху, це не означає автоматично інтерфейс RESTful, оскільки тепер ви думаєте, що можете передзвонити кожну перестановку ресурсом. На жаль, не існує жодного магічного процесу, який можна застосувати, щоб визначити, якими мають бути ресурси у вашій системі. Це вимагає ретельного проектування, а не механічної формули.
Даррел Міллер

2
Ще раз архітектура REST не ДЕРЖАВИ про те, що є в URL-адресі. URL-адреса має бути непрозорою . Не важливо відпочивати, чи ви використовуєте в якості сеператорів косої риски, крапки з комою або однокольорові серця. Прочитайте це і відповідайте на це - а не на те, що ви собі уявляєте.
Бретон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.