Канарка у вугільній шахті.
Я чекаю такого питання вже близько року. Цього дня було неминуче, і я впевнений, що ми побачимо ще багато подібних питань у найближчі місяці.
Попереджувальні знаки
Ви абсолютно правильні, щоб створити КРАЩИХ клієнтів, ніж клієнти SOAP, потрібно більше часу. Набори інструментів SOAP забирають багато кодового коду і майже не докладають зусиль для клієнтських проксі-об'єктів. Завдяки такому інструменту, як Visual Studio та серверна URL-адреса, я можу отримати доступ до віддалених об'єктів довільної складності, локально за менше п'яти хвилин.
Послуги, які повертають application / xml та application / json, настільки дратують розробників клієнтів. Що ми маємо робити з цією інформацією?
На щастя, багато сайтів, які надають послуги REST, також надають купу клієнтських бібліотек, щоб ми могли використовувати ці бібліотеки для отримання доступу до ряду сильно набраних об’єктів. Здається, ніби німець, хоча. Якби вони використовували SOAP, ми могли б самі влаштувати ці класи проксі-серверів.
Мило над головою, га. Саме затримка вбиває. Якщо людей дійсно турбує кількість зайвих байтів, що переходять через провід, то, можливо, HTTP не є правильним вибором. Ви бачили, скільки байтів використовує заголовок користувача-агента?
Так, ви коли-небудь намагалися використовувати веб-браузер як інструмент налагодження для будь-якого іншого, крім HTML та JavaScript. Повірте, це відстій. Ви можете використовувати лише два дієслова, кешування постійно стає на шляху, обробка помилок проковтує стільки інформації, вона постійно шукає чортова favicon.ico. Просто застрели мене.
Зчитувана URL-адреса. Тільки іменники, без дієслів. Так, це просто, доки ми робимо лише операції з CRUD, і нам потрібно лише отримати доступ до ієрархії об'єктів. На жаль, більшість додатків потребують трохи більшого функціоналу, ніж це.
Наступаюча катастрофа
Наразі існує метричний навантажувач розробників, які зараз розробляють додатки, що інтегруються з послугами REST, які зараз підходять до того ж набору висновків, що і у вас. Їм обіцяли простоту, гнучкість, масштабованість, еволюціонічність та священний грааль багаторазового використання. Характеристики самого Інтернету, як все може піти не так.
Однак вони виявляють, що версія - це стільки ж проблема, але компілятор не допомагає виявляти проблеми. Рукописний клієнтський код - це непросто підтримувати, коли структури даних розвиваються і URL-адреси отримують відновлення. Створення API-інтерфейсів навколо лише іменників та чотирьох дієслів може бути дуже важким, особливо якщо RESTful Url завзяті повідомляють вам, коли ви можете та не можете використовувати рядки запитів.
Розробники почнуть запитувати, чому ми витрачаємо свої зусилля на підтримку форматів Json і форматів Xml, чому б не просто зосередити свої зусилля на одному та зробити це добре?
Як все пішло не так
Я скажу вам, що пішло не так. Ми як розробники дозволяємо відділам маркетингу скористатися нашою основною слабкістю. Наш вічний пошук срібної кулі засліпив нас реальністю того, що насправді є REST. На поверхні REST здається таким легким і простим. Назвіть свої ресурси за допомогою URL-адрес та використовуйте GET, PUT, POST та DELETE. Чорт, нас, розробники, вже знають, як це зробити, ми вже багато років працюємо з базами даних, у яких є таблиці та стовпці та оператори SQL, які мають SELECT, INSERT, UPDATE та DELETE. Це повинен був бути шматок пирога.
Є інші частини REST, які деякі люди обговорюють, такі як самоописованість та обмеження гіпермедіа, але ці обмеження не такі прості, як ідентифікація ресурсів та рівномірний інтерфейс. Здається, додає складності, де бажаною метою є простота.
Ця поливана версія REST багато в чому підтверджується в культурі розробників. Були створені серверні рамки, які заохочували ідентифікацію ресурсів та єдиний інтерфейс, але нічого не зробили для підтримки інших обмежень. Терміни почали плавати навколо диференціації підходів (HI-REST проти LO-REST, Corporate REST vs Academic REST, REST проти RESTful).
Кілька людей кричать, що якщо ви не застосовуєте всі обмеження, це не REST. Ви не отримаєте переваг. Немає половини REST. Але ці голоси були позначені як релігійні завзяті, які були засмучені тим, що їхній дорогоцінний термін був викрадений із незрозумілості та перетворений на мейнстрим. Ревні люди, які намагаються зробити звук REST складнішим, ніж це є.
REST, термін, безумовно, став основним. Практично кожен великий веб-ресурс, що має API, підтримує "REST". Twitter і Netflix - це два дуже популярних. Страшно в тому, що я можу придумати лише один публічний API, який є самоописовим, і є пригорща, яка справді реалізує обмеження гіпермедіа. Впевнені, що деякі сайти, такі як StackOverflow та Gowalla, підтримують посилання у своїх відповідях, але у їхніх посиланнях є величезні щілини. API API StackOverflow не має кореневої сторінки. Уявіть, наскільки успішним був би веб-сайт, якби не було домашньої сторінки для веб-сайту!
Ви були введені в оману, боюся
Якщо ви зробили це досі, коротка відповідь на ваше запитання полягає в тому, що API (Netflix і Twitter) не відповідають усім обмеженням, і тому ви не отримаєте переваг, які повинні принести REST apis.
Клієнти REST займають більше часу, ніж клієнти SOAP, але вони не прив’язані до однієї конкретної послуги, тому ви повинні мати можливість повторно використовувати їх у всіх службах. Візьмемо класичний приклад веб-браузера. Скільки сервісів може отримати доступ до веб-браузера? А що з читачем каналів? Тепер, скільки різних сервісів може отримати середній клієнт Twitter? Так, лише один.
Клієнти REST не повинні бути побудовані для взаємодії з однією службою, вони повинні бути створені для обробки конкретних типів медіа, які можуть обслуговуватися будь-якою службою. Очевидний питання до цього полягає в тому, як можна створити клієнта REST для послуги, яка постачає application / json або application / xml. Ну ти не можеш. Це тому, що ці формати абсолютно непридатні для клієнта REST. Ви це самі сказали,
ви повинні зробити "здогадки" щодо того, що повернеться через трубу, оскільки немає реальної схеми чи довідкового документа
Ви абсолютно правильні для таких служб, як Twitter. Однак обмеження самоопису в REST говорить про те, що заголовок типу вмісту HTTP повинен точно описувати вміст, який передається по дроту. Додаток application / json та application / xml нічого не говорить про вміст.
Що стосується розгляду працездатності систем на базі REST, то слід переглянути більш широку картину. Говорити про байти конвертів - це як говорити про розмотування циклу при порівнянні швидкого сортування до сортування оболонки. Є сценарії, коли SOAP може працювати краще, і є сценарії, коли REST може працювати краще. Контекст - це все.
REST отримує значну перевагу від продуктивності, будучи дуже гнучким щодо того, які типи медіа підтримує, і завдяки складній підтримці кешування. Щоб кешування працювало добре, хоча потрібно дотримуватися майже всіх обмежень.
Ваш останній пункт про читабельні URL-адреси на сьогодні є найбільш іронічним. Якщо ви справді зобов'язуєтесь обмежувати гіпермедіа, то кожна URL-адреса може бути GUID, і розробник клієнта нічого не втратить при читанні.
Те, що URI повинні бути непрозорими для клієнта, є однією з найбільш ключових речей при розробці систем REST. Прочитані URL-адреси зручні для розробника сервера, а добре структуровані URL-адреси полегшують серверну структуру для відправки запитів, але це деталі впровадження, які не повинні впливати на розробників, які споживають API.
API API навіть не близький до RESTful, і тому ви не можете бачити жодної користі від використання його через SOAP. API Netflix набагато ближче, але використання загальних типів носіїв свідчить про те, що недотримання навіть єдиного обмеження може мати глибокий вплив на переваги, отримані від послуги.
Це може бути не вся їх вина
Я багато демпінгував з постачальниками послуг, але для танцю RESTfully потрібно два. Сервіс може дотримуватися всіх обмежень релігійно, і клієнт все ще може легко скасувати всі переваги.
Якщо жорсткі коди клієнта вимагають доступу до певних типів ресурсів, це заважає серверу змінювати ці URL-адреси. Будь-яка побудова URL-адрес, заснована на неявних знаннях того, як служба структурує свої URL-адреси, є порушенням.
Висловлення припущень щодо того, який тип подання буде повернено за посиланням, може призвести до проблем. Здійснення припущень щодо змісту подання на основі знань, які прямо не вказані в заголовках HTTP, безумовно, створить з'єднання, яке завдасть болю в майбутньому.
Чи повинні вони використовувати SOAP?
Особисто я не думаю. REST виконано правильно дозволяє розподіленій системі розвиватися в довгостроковій перспективі. Якщо ви будуєте розподілені системи з компонентами, які розробляються різними людьми і повинні тривати довгі роки, то REST - досить хороший варіант.