Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Например, большинство браузеров имеют ограниченную поддержку PUT и DELETE.
RESTful API очень трудно дебажить
Словарь REST недостаточно насыщен
Типичный заголовок для привлечения внимания, я не говорил что он мне нравится :)
привязка к HTTP может быть критической в случаях интеграции с разнородными системами,
А теперь скажите мне, сколько раз в своей жизни вы видели SOAP, реализованный не поверх HTTP?)Пока работали над обменом сообщений со смежными системами — каждый день видел.
(для некоторых проектов)
/users/1, /users/messages), в коде приложения используется ORM, а потом снова используется реляционная модель. Особенно нелепо это выглядит в приложениях, которые делают только самые примитивные CRUD операции.location ~ /(?<resources>cities|rockets) {
rds_json on;
location ~ /(?<id>\d+) {
postgres_pass database;
postgres_query "SELECT * FROM $resources WHERE id=$id";
}
location ~ / {
postgres_pass database;
postgres_query "SELECT * FROM $resources";
}
}
Основная проблема RESTful в том, что каждый раз при создании нового API фактически заново создается транслятор HTTP-to-SQL. Зачастую выходит так, что сам API имеет реляционный характер (/users/1, /users/messages), в коде приложения используется ORM, а потом снова используется реляционная модель. Особенно нелепо это выглядит в приложениях, которые делают только самые примитивные CRUD операции
Зачастую выходит так, что сам API имеет реляционный характер (/users/1, /users/messages), в коде приложения используется ORM, а потом снова используется реляционная модель.
Основная проблема RESTful в том, что каждый раз при создании нового API фактически заново создается транслятор HTTP-to-SQL. Зачастую выходит так, что сам API имеет реляционный характер (/users/1, /users/messages), в коде приложения используется ORM, а потом снова используется реляционная модель. Особенно нелепо это выглядит в приложениях, которые делают только самые примитивные CRUD операции.
Есть, например, проект HTSQL, в котором на базе HTTP строится мощный язык запросов практически со всеми часто используемыми возможностями SQL, который напрямую транслируется в весьма оптимальный запрос на SQL. Для nginx (openresty) есть модуль ngx_drizzle, который умеет асинхронно отправлять запросы в MySQL и модуль rds_json, который в потоковом режиме строит из результатов JSON. Т. е. самое простое API можно создавать прямо в config-ах nginx как-то так:
Если что, я сейчас потихоньку пишу такой модуль для MySQL, работая напрямую с InnoDB и со многими потенциальными проблемами знаком.
Правильно было бы, на мой взгляд, сделать парсер путя с параметрами в URI в самой БД
Если вы готовы дать кому-то возможность делать прямые SQL запросы в вашу базу данных,
SQL база данных всегда будет хуже эмулировать noSQL.
Имя базы данных и таблицы намного лучше придумывания каких-то своих путей.
Я не говорил о том, что запросы должны идти без какой-либо авторизации.
какая-то связность между объектами
И если вы не понимаете, например, что именно происходит при сериализации/десериализации JSON в POJO
JSON — это не объект, это синтаксическая конструкция, описывающая объект, причем далеко не самым лаконичным способом.
В Javascript например ничего не происходит
дергается небыстрый Reflection API, либо на лету осуществляется кодогенирация
Вы знаете разницу между Java и JavaScript'ом? Какой Reflection API?
А в чем проблема? Скажем в Java сериализация/десериализация json в java объекты делается буквально одной строчкой, причем никто не мешает добавить этим java объектам теги JPA и сразу напрямую сохранять их в ORM.
Практически в любом API, где имеется какая-то связность между объектами («сообщения пользователя», «комментарии к новости»), выстраиваются отношения один-к-одному и один-ко-многим.
Пример скинул выше
К моему счастью, бэк-енд команда согласилась параллельно с RESTful запустить JSON-pure API, просто перенеся все свои методы и коды в JSON. Спустя несколько месяцев все мои знакомые, ранее использовавшие RESTful, перешли на JSON-pure, осознав, что это гораздо удобнее.
Если API предоставляется через SOAP (так поступает большинство крупных компаний банковского, страхового и других B2B секторов), достаточно взять кодогенератор, который из WSDL файла сгенерирует прокси классы и всё, через 3 минуты ты можешь делать запросы, при этом особенности транспорта тебя не волнуют. Круче всего это реализовал Microsoft в своём WCF, где через конфигурационный файл можно выбрать любой транспорт, от http(s) до MSMQ (включая tcp и named pipes). WSDL файл и SOAP автоматически генерируются на основе кода.
xs:any.В мире единицы сайтов, для которых экономия на траффике в таких масштабах превысит стоимость разработки REST.
И опять же, если следовать RESTful, то те моменты, которые через RPC решаются за один запрос, через RESTful за кучу.
А REST, вот я так в толк и не возьму, какие у него основные плюсы.
(а) реализации SOAP на этой и той стороне отличаются (например, вы по-разному трактуете время без указания часового пояса)
(б) в WSDL (точнее, XSD) описаны далеко не все детали формата, а в паре мест стоит xs:any.
(ц) авторизация… авторизация? авторизация, мать ее!не понял вас тут
А что такого в «стоимости разработки REST»? Чем она радикально выше, чем разработка под SOAP?
Конкретный пример можно?
(а) простота использования из браузерного кода
(б) опора на существующую HTTP-инфраструктуру (например, кэширование)
(ц) «встроенная» мультиформатность
(д) более очевидная семантика
Если API кривой, то не важно REST он, не REST, проблемы всё равно будут.
не понял вас тут
Ну, как минимум, надо свой транспорт писать
Формирование JSON, запрос к удалённому компьютеру, считывание ошибок, протоколирование, парсинг JSON обратно в объекты.
HttpRequestMessage/HttpResponseMessage) с расширениями.Это работает прозрачно, как будто всё происходит в рамках одного процесса.
Конкретный пример — работа с транзакциями
Тут согласен, но это делает его в основном пригодным только для фронтэнда
Причём в рамках одного домена, из-за ограничения на кроссдоменные запросы.
В HTTP есть простые и понятные способы аутентификации и авторизации. В SOAP с этим все весело, особенно когда вы делаете межвендорную (например, .net — Java) интеграцию.
Http-клиент, в любой разумной платформе из коробки.
У того же Microsoft для всего этого давно есть обертка (HttpRequestMessage/HttpResponseMessage) с расширениями.
До первой проблемы, особенно проблемы формата 400 Bad Request без объяснений.
Угу, а теперь давайте задумаемся, что мы не хотим писать два разных сервиса для веб-клиентов и мобильных клиентов, а после этого добавим сюда third-party. Вот, собственно, и вся интеграция для нормального веб-приложения.
Ну конечно SOAP не решает, разве я это где-то говорил?
Если API предоставляется через SOAP [...], достаточно взять кодогенератор, который из WSDL файла сгенерирует прокси классы и всё, через 3 минуты ты можешь делать запросы, при этом особенности транспорта тебя не волнуют.
На практике, обычно выделяют отдельный метод для авторизации, который возвращает токен и этот токен используется в последующих запросах, это не является проблемой.
это не отменяет необходимость формирования JSON, запроса к удалённому компьютеру, считывания ошибок, протоколирования, парсинга JSON обратно в объекты.
//GET
var response = await client.GetAsync("api/products/1");
response.EnsureSuccessStatusCode();
Product product = await response.Content.ReadAsAsync>Product>();
//POST
var gizmo = new Product() { Name = "Gizmo", Price = 100, Category = "Widget" };
await client.PostAsJsonAsync("api/products", gizmo);
А REST тут чем лучше?
Под транзакциями я понимаю ACID и не понимаю что там плохого.
Моя позиция: REST переоценен, во многих ситуациях SOAP позволяет экономить время на разработке клиента, а в ряде случаев и сервиса. Вы с этим принципиально не согласны?
Распределенные транзакции плохо удаются любому протоколу, не важно, RPC это или SOAP.
Вот здесь:
Если API предоставляется через SOAP [...], достаточно взять кодогенератор, который из WSDL файла сгенерирует прокси классы и всё, через 3 минуты ты можешь делать запросы, при этом особенности транспорта тебя не волнуют.
Стандарты? WS-Security? Нет, не слышал. Вот в этом и проблема: каждый делает по-своему.
Вы, видимо, не в курсе
Распределенные транзакции плохо удаются любому протоколу, не важно, RPC это или SOAP. Это проблема распределенности, а не протокола.
Если же вы будете сравнивать с любой другой устоявшейся парадигмой (messaging, REST), то выяснится, что различия более архитектурные, чем временные, и именно от архитектуры и надо плясать.
В этом абзаце написано про то, что SOAP позволяет автоматически сгенерировать прокси классы, которые позволят сразу делать запросы не учитывая конкретных особенностей транспорта. Где вы тут увидели что SOAP решает?
А в REST значит всё стандартизировано?
А у вас класс Product откуда взялся? Сами написали? Ну круто
Обоснуйте
А SOAP и RPC — не архитектура?
В утверждении «позволят сразу делать запросы».
В реальности это далеко не всегда так.
В REST не стандартизовано, но в REST безопасность делегирована на транспортный уровень, а там, в свою очередь, есть устоявшиеся практики.
В качестве развлечения предлагаю вам добавить в WCF подписание сообщений по ГОСТу.
Очень просто. RPC вообще (и SOAP в частности) не имеет транзакционной семантики, ее всегда добавляет какой-то дополнительный инструмент. Соответственно, когда вам нужна распределенная транзакция, вы добавляете координатор и соответствующие вызовы — и вам, по большому счету, пофиг, куда их добавлять.
SOAP и RPC (как и messaging или REST) — это парадигмы, между которыми есть крупные отличия, радикально влияющие на архитектуру решения.
Но если API спроектирован хорошо, все прокси-классы сгенерируются и запросы можно будет делать сразу. Но это не проблема SOAP, а кривых рук разработчиков API.
А что мешает использовать https для SOAP запросов?
То что им не всегда следуют — не проблема SOAP, а кривизны рук разработчиков API.
Не по ГОСТу, а по AES, но с учётом того, что инфраструктура криптопровайдеров стандартизирована, а ГОСТовские провайдеры есть, не думаю что там будут особые сложности.
А в REST, кстати, это как-то очень просто делается?
И что, есть реализации координаторов для REST?
Ну REST как бы больше ограничений накладывает. Тут и отсутствие состояний, и обязательное использование http, и жёстка завязка на предопределённые коды ответа и методы http. SOAP (simple object access protocol) и RPC (remote procedure call) по определению в с этой стороны гораздо более гибкие.
Вы же почему-то предложили не WS-Security, а «На практике, обычно выделяют отдельный метод для авторизации, который возвращает токен и этот токен используется в последующих запросах».
А что, есть реализации координаторов для SOAP?
Вы почему-то считаете, что я считаю, что SOAP плохой, а REST — хороший. А я считаю, что каждый из них подходит для своей задачи, а для каких-то задач подходит что-то третье.
Не я предложил, это чаще всего встречается в существующих API, которые мы к себе интегрируема.
Ну как бы да: msdn.microsoft.com/en-us/library/ff384250.aspx
это не отменяет необходимость формирования JSON, запроса к удалённому компьютеру, считывания ошибок, протоколирования, парсинга JSON обратно в объекты.
А у вас класс Product откуда взялся? Сами написали? Ну круто.
Если API предоставляется через SOAP [...], достаточно взять кодогенератор, который из WSDL файла сгенерирует прокси классы и всё, через 3 минуты ты можешь делать запросы, при этом особенности транспорта тебя не волнуют.
объём сгенерированного кода был за 3 000 строк.
WSDL файл и SOAP автоматически генерируются на основе кода.
Нет, я не спорю, Рой — отличный парень и, конечно же, у него было множество классных идей… Тем не менее, я не уверен, что RESTful API попадает в их список.
Много веб-сервисов именно stateless и являются, более того — именно такие сервисы и рекомендуется делать.
Потому что rest — stateless, а soap — нет.С чего бы? SOAP over HTTP — ничуть не менее stateless, чем REST.
REST — это стиль архитектуры программного обеспечения для построения распределенных масштабируемых веб-сервисов. Рой выступал за использование стандартных HTTP методов так, чтобы придавать запросам определённый смысл. [...] Многие положительно отнеслись к такой парадигме и стали использовать её в разработке веб-сервисов с использованием HTTP. Это и есть то, что мы называем RESTful API.
Например, когда мы должны использовать код 200 ОК? Можем ли мы использовать его для подтверждения успешного апдейта записи, или нам стоит использовать код 201 Created?
На самом деле, единственными кодами, обработки которых можно не бояться, являются 200 ОК и 500 Internal server error.
— отсутствие состояний: все детали операции содержатся в самой операции; т.е. в парадигме REST нельзя сделать вот так:
DELETE /user/data
Надо заметить при этом, что в своих сообщениях разработчик может поддерживать принципы REST, введя свои типы сообщений для CRUD операций и поддерживая логику их обработки.
Да, тоже не надо гнаться. Любая идея, возведенная в абсолют
Я четко сказал, что можно заимствовать концепцию («Принципы REST») и избавиться от многих ограничений данного подхода.
Кешируемость в ряде случаев — как раз относится к минусам, откоторых хочется избавиться.
Заимствовать (не дублировать полностью) основной концепт этого подхода
RESTful API — большая ложь