Які найкращі / поширені RESTful url дієслова та дії?


86

Я намагаюся знайти деяку інформацію про найкращі та найпоширеніші дії RESTful url.

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

/question/show/<whatever>
/question/edit/<whatever>
/question/update/<whatever> (this is the post back url)
/question/list   (lists the questions)

хм спасибі всім, хто допомагає :)

Відповіді:


173

Використовуйте URL-адреси для вказівки об’єктів, а не дій:

Зверніть увагу на те, що ви вперше згадали, не є RESTful:

/questions/show/<whatever>

Натомість вам слід використовувати ваші URL-адреси, щоб вказати свої об’єкти:

/questions/<question>

Потім ви виконуєте одну з наведених нижче операцій на цьому ресурсі.


ОТРИМАТИ:

Використовується для отримання ресурсу, запиту списку ресурсів, а також для запиту інформації про ресурс лише для читання.

Щоб отримати джерело запитань:

GET /questions/<question> HTTP/1.1
Host: whateverblahblah.com

Щоб перерахувати всі ресурси запитань:

GET /questions HTTP/1.1
Host: whateverblahblah.com

ПОСТ:

Використовується для створення ресурсу.

Зверніть увагу, що наступним є помилка:

POST /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

Якщо URL-адреса ще не створена, ви не повинні використовувати POST для її створення, вказуючи назву. Це має призвести до помилки, яку ресурс не знайдено, оскільки його ще не існує. Спочатку слід ВСТАВИТИ ресурс на сервер. Ви можете стверджувати, що створюючи нове запитання, ви також оновлюєте ресурс / questions, оскільки тепер він поверне ще одне питання зі свого списку питань.

Ви повинні зробити щось подібне для створення ресурсу за допомогою POST:

POST /questions HTTP/1.1
Host: whateverblahblah.com

Зауважте, що в цьому випадку не вказано ім’я ресурсу, шлях до URL-адреси нових об’єктів буде вам повернено.

ВИДАЛИТИ:

Використовується для видалення ресурсу.

DELETE /questions/<question> HTTP/1.1
Host: whateverblahblah.com

ВСТАНОВИТИ:

Використовується для створення або перезапису ресурсу, коли ви вказуєте URL-адресу ресурсів.

Для нового ресурсу:

PUT /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

Щоб замінити існуючий ресурс:

PUT /questions/<existing_question> HTTP/1.1
Host: whateverblahblah.com

... Так, вони однакові. PUT часто описується як метод "редагування", оскільки, замінивши весь ресурс на дещо змінену версію, ви відредагували те, що клієнти ОТРИМАЮТЬ при наступній роботі.


Використання REST у формах HTML:

Специфікація HTML5 визначає GET та POST для елемента форми .

Атрибут вмісту методу - це перерахований атрибут із такими ключовими словами та станами:

  • Ключове слово GET, що відображається у стані GET із зазначенням методу HTTP GET.
  • Ключове слово POST, що відображається у стан POST, що вказує на метод HTTP POST.

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

ЛІК:

Це метод, який був визначений у офіційному RFC. Він призначений для використання, коли ви хочете надіслати лише часткову модифікацію ресурсу, він буде використовуватися подібно до PUT:

PATCH /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

Різниця полягає в тому, що PUT повинен надіслати весь ресурс, незалежно від того, наскільки великий він порівняний із тим, що насправді змінилося, тоді як PATCH ви можете надіслати лише зміни.


Привіт, Брайане .. чим більше я читаю це, тим більше це робить сенс. Я припускаю, що деякі браузери (або версії браузера) не підтримують PUT або DELETE? якщо це так, чи замість цього ми використовуємо POST?
Pure.Krome

1
Привіт чистий.Кноме; Веб-браузери підтримують їх усіх, також будь-яка бібліотека HTTP повинна підтримувати їх усіх.
Брайан Р. Бонді

4
Я б порекомендував придбати цю книгу до речі, якщо ви хочете дізнатись все про REST oreilly.com/catalog/9780596529260
Брайан Р. Бонді

1
@Brian: ще кілька запитань про ваші приклади PUT. >> PUT / questions / <new_question> Чому ви робите це, замість того, щоб робити >> PUT / questions /, оскільки всі дані форми будуть використані для створення нового ресурсу? (продовження наступного коментаря) ...
Pure.Krome

1
@Brian R. Bondy, Дякую за чудову відповідь. Запит POST до існуючого ресурсу описується як "додавання" у спокійну книгу oreilly (стор: 100, 101), всупереч вашому загальному "модифікуючому" терміну. Зрештою, додавання є більш конкретним, ніж модифікація - що може передавати «ВСТАНОВЛЕННЯ на існуючий ресурс» - і семантично звучить більш правильним для POST - додавання нового ресурсу до вказаного посилання, або шляхом додавання до нього, або створення дочірнього ресурсу до нього .
Özgür

11

Якщо /questions/10припустити, що питання є дійсним, тоді метод використовується для взаємодії з ним.

POST додати до нього

PUT, щоб створити або замінити його

ОТРИМАЙТЕ для перегляду / запиту

і ВИДАЛИТИ, щоб добре .. видалити його.

URL-адреса не змінюється.


4
Неправильно. PUT повинен бути ідемпотентним. Ви повинні мати можливість робити один і той же запит PUT багато разів, без ефекту після першого разу. Отже, створення ресурсу з кожним запитом PUT не є ідемпотентним.
aehlke

3
"Методи PUT та DELETE визначені ідемпотентними, тобто багато ідентичних запитів повинні мати той самий ефект, що і один запит.", Використовуючи розміщення в URI, який наразі не робить доступним ресурс, можна створити ресурс. Негайно ПУТИНГ просто зробив би це ще раз, що не мало би ефекту. Таким чином ви створюєте ресурс, але запит все ще є неімпотентним. Якщо ви пізніше повернетесь і захочете змінити ресурс, ви перекладете на той самий URI з різними даними (що буде іншим запитом і може бути повторене будь-яку кількість разів з однаковим результатом).
Аллаін Лалонд

1
Власне, погляньте на відповідь, яка набрала 25 голосів вище, там зазначено, що PUT можна використовувати для створення або заміни ресурсу.
Аллаін Лалонд

3
Створення працює лише за умови, що дозволяється вказувати ідентифікатор нового ресурсу. Незважаючи на те, що це можливо, користувачеві частіше
доцільніше відправити

2
@aehIke Створення нового ресурсу за допомогою PUT не робить його неімпотентним, оскільки ідея полягає в тому, що якщо я 'PUT / items / 10' і елемент 10 раніше не існував, тоді він буде просто створений. Однак, якщо я вдруге повторюю "PUT / items / 10", тепер він уже існує, тому його буде просто замінено, отже, ідемпотентність зберігається, оскільки наступні запити PUT не мають нових побічних ефектів. (Звичайно, це припускаючи, що я продовжую
покладати

3

Я збираюся вийти на кінцівку і здогадатися, що ви маєте на увазі те, що є стандартними контролерами для MVC, коли ви говорите "RESTful" URL-адреси, оскільки ваші приклади можна вважати не "RESTful" (див. Цю статтю).

Оскільки Rails дійсно популяризував стиль URL-адреси, який вас цікавить, я пропоную нижче дії контролера за замовчуванням, вироблені ScaffoldingGenerator у Ruby on Rails. Вони повинні бути знайомі кожному, хто користується програмою Rails.

Дії та подання, що виконуються в естафеті: індекс, список, показ, новий, створення, редагування, оновлення, знищення

Зазвичай ви б побудували це як:

http://application.com/controller/<action>/<id>

5
Позасмугові конвенції URI НЕ ВІДХОДЯТЬСЯ. Цитуючи самого Філдінга: "REST API не повинен визначати фіксовані імена ресурсів або ієрархії (очевидна взаємодія клієнта і сервера). Сервери повинні мати свободу контролювати власний простір імен. Натомість дозволити серверам вказувати клієнтам, як створювати відповідні URI , як це робиться у формах HTML та шаблонах URI, визначаючи ці інструкції в межах типів носіїв та відносин посилань .. "
aehlke

1

Ось відображення ваших поточних URL-адрес за принципом REST:

/question/show/<whatever>

Якщо ви ідентифікуєте питання як ресурс, тоді воно повинно мати унікальну URL-адресу. Поширеною практикою є використання GET для його відображення (отримання). Це стає:

GET /question/<whatever>

/question/edit/<whatever>

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

Тут є два варіанти: ваша програма - це програма (а не веб-сайт), тоді вам може бути краще використовувати JavaScript для перетворення ресурсу на редагований ресурс на стороні клієнта.

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

GET /question/<whatever>;edit

/question/update/<whatever> (this is the post back url)

Це має змінити питання, тому PUT - правильний метод:

PUT /question/<whatever>

/question/list   (lists the questions)

Список питань насправді є батьківським ресурсом питання, тому це природно:

GET /question

Тепер вам може знадобитися ще:

POST /question (create a new question and returns its URL)
DELETE /question/<whatever> (deletes a question if this is relevant)

Тада :)


-1

Вашими чотирма прикладами можуть бути:

GET /questions/123
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
GET /questions

Щоб додати запитання:

POST /questions q=What+is+the+meaning+of+life

Сервер відповість:

200 OK (or 201 Created)
Location: /questions/456
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.