Читачів, що знайшли цю тему, вразить нескінченна дискусія про те, що вам слід робити, та відносна відсутність уроків із досвіду. Те, що REST «віддають перевагу» над SOAP - це, напевно, навчання на високому рівні з досвіду, але добро, що ми повинні були прогресувати звідти? Це 2016. Дисертація Роя була в 2000 році. Що ми розробили? Було весело? З вами було легко інтегруватися? Підтримувати? Чи впорається він із підйомом смартфонів та нестійкими мобільними зв’язками?
За словами МО, мережі реального життя є ненадійними. Запрошує тайм-аут. З'єднання скидаються. Мережі опускаються годинами або днями. Потяги прямують в тунелі з мобільними користувачами на борту. Для будь-якого запиту (як це іноді визнається у всій цій дискусії) запит може впасти у воду на своєму шляху, або відповідь може впасти у воду на зворотному шляху. В цих умовах видача запитів PUT, POST та DELETE безпосередньо проти матеріальних ресурсів завжди вважала мене трохи жорстоким і наївним.
HTTP не робить нічого для того, щоб забезпечити надійне завершення відповіді на запит, і це просто добре, оскільки це належна робота мережевих програм. Розробляючи таку програму, ви можете перестрибувати через обручі, щоб використовувати PUT замість POST, а потім ще більше обручів, щоб на сервері певний вигляд помилок, якщо ви виявите дублюючі запити. Повернувшись до клієнта, вам доведеться перестрибувати обручі, щоб інтерпретувати ці помилки, переробляти, повторно підтверджувати та репостувати.
Або ви можете це зробити : розгляньте свої небезпечні запити як ефемерні ресурси одного користувача (назвемо їх діями). Клієнти вимагають нової "дії" на основний ресурс із порожнім POST на ресурс. POST використовуватиметься лише для цього. Отримавши безпечне володіння URI свіжовичавленої дії, клієнт виводить небезпечний запит на URI дії, а не на цільовий ресурс . Розв’язання дії та оновлення "реального" ресурсу належним чином є завданням вашого API, і тут він відокремлюється від ненадійної мережі.
Сервер займається бізнесом, повертає відповідь і зберігає його проти узгодженого URI дії . Якщо щось піде не так, клієнт повторює запит (природна поведінка!), І якщо сервер його вже бачив, він повторює збережену відповідь і більше нічого не робить .
Ви швидко помітите схожість з обіцянками: ми створюємо та повертаємо заповнювач для результату, перш ніж робити щось. Також, як і обіцянка, дія може бути успішною або невдалою одноразово, але її результат можна отримати неодноразово.
Найкраще, що ми надаємо можливість надсилання та прийому додатків пов'язувати унікально визначені дії з унікальністю у відповідних середовищах. І ми можемо почати вимагати і виконувати! Відповідальної поведінки від клієнтів: повторюйте свої запити скільки завгодно, але не продовжуйте створювати нові дії, поки не будете мати остаточного результату від існуючого.
Таким чином, проходять численні проблеми, що мають терни. Повторні запити на вставлення не створюватимуть дублікатів, і ми не створюємо реальний ресурс, поки не володіємо даними. (Стовпці бази даних можуть залишатися нерегульованими). Повторні запити на оновлення не впливатимуть на несумісні стани і не замінюватимуть наступні зміни. Клієнти можуть (повторно) отримати та безпроблемно обробити оригінальне підтвердження з будь-якої причини (клієнт зазнав аварії, відповідь пропала тощо).
Послідовні запити на видалення можуть бачити та обробляти оригінальне підтвердження, не потрапляючи на помилку 404. Якщо все займе більше часу, ніж очікувалося, ми можемо відповісти тимчасово, і у нас є місце, де клієнт може перевірити на остаточний результат. Найприємнішою частиною цієї картини є її властивість Кунг-Фу (Панда). Ми враховуємо слабкість, схильність клієнтів повторювати запит будь-коли, коли вони не розуміють відповідь, і перетворюємо це на міцність :-)
Перш ніж сказати мені, що це не RESTful, будь ласка, врахуйте численні способи дотримання принципів REST. Клієнти не створюють URL-адреси. API залишається відкритим, хоча і з невеликою зміною семантики. Дієслова HTTP використовуються відповідним чином. Якщо ви вважаєте, що це важлива зміна для впровадження, я можу сказати вам із досвіду, що це не так.
Якщо ви думаєте, що у вас буде величезна кількість даних для зберігання, давайте поговоримо про обсяги: типовим підтвердженням оновлення є частка кілобайт. На даний момент HTTP дає вам хвилину чи дві, щоб остаточно відповісти. Навіть якщо ви зберігаєте акції лише тиждень, клієнти мають достатньо шансів наздогнати. Якщо у вас дуже великі обсяги, вам може знадобитися спеціалізований запас цін, що відповідає кислоті, або рішення в пам'яті.