Мне немного грустно видеть, что по прошествии более 10 лет нет ответа, в котором действительно говорится о том, как такая вещь, запрошенная в OP, может быть разработана в архитектуре 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>
Пример выше, т.е. утверждает, что есть два поля ввода, которые могут быть заполнены пользователем или некоторыми другими автоматами, и что при вызове элемента ввода submit браузер заботится о форматировании входных данных в 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 , halform , ion или Hydra . Однако в настоящее время я не знаю, какой тип носителя может автоматически кодировать входные данные text/csv
напрямую, поэтому может потребоваться определить его и зарегистрировать в реестре типов носителей IANA. .
Я думаю, что загрузка и выгрузка полного набора параметров не должны быть проблемой. Как упоминалось ранее, целевой URI не имеет значения, так как клиент будет использовать URI только для извлечения нового контента для обработки. Фильтрация по бизнес-дате также не должна быть сложной. Здесь сервер должен, однако, клиент со всеми возможностями, которые клиент может просто выбрать. В последние годы развились GraphQL и RestQL, которые представили язык, похожий на SQL, который может быть нацелен на определенную конечную точку для получения отфильтрованного ответа. Однако в истинном смысле REST это нарушает идею, лежащую в основе REST: a) GraphQL, т. Е. Использует только одну конечную точку, которая каким-то образом препятствует оптимальному использованию кэширования; к базовой модели данных ресурса.
Активация или деактивация определенных параметров конфигурации - это просто вопрос запуска элементов управления гипермедиа, которые предоставляют эту возможность. В HTML-формах это может быть простой флажок или многострочный выбор в списке или тому подобное. В зависимости от формы и того, какой метод он определяет, он может затем отправить всю конфигурацию с помощью PUT
или быть осведомленным о внесенных изменениях и выполнить только частичное обновление с помощью PATCH
. Последний требует в основном вычисления представления изменения к обновленному и передает серверу необходимые шаги для преобразования текущего представления в желаемое. В соответствии со спецификацией PATH это должно быть сделано внутри транзакции, чтобы выполнялись все или ни один из шагов.
HTTP позволяет и рекомендует серверу проверять полученный запрос заранее, прежде чем применить изменения. Для PUT спецификация гласит:
Исходный сервер ДОЛЖЕН проверить, что представление PUT соответствует любым ограничениям, которые имеет сервер для целевого ресурса, который не может или не будет изменен PUT. Это особенно важно, когда исходный сервер использует внутреннюю информацию о конфигурации, связанную с URI, чтобы установить значения для метаданных представления в ответах GET. Когда представление PUT несовместимо с целевым ресурсом, исходный сервер ДОЛЖЕН либо сделать их согласованными, преобразовав представление или изменив конфигурацию ресурса, либо ответить соответствующим сообщением об ошибке, содержащим достаточную информацию, чтобы объяснить, почему представление не подходит. Предлагаются коды состояния 409 (конфликт) или 415 (неподдерживаемый тип носителя),
Например, если целевой ресурс всегда настроен на использование Content-Type «text / html», а представление, представляющее собой PUT, имеет Content-Type «image / jpeg», исходный сервер должен выполнить одно из следующих действий:
а. перенастроить целевой ресурс для отражения нового типа носителя;
б. преобразовать представление PUT в формат, соответствующий формату ресурса, перед сохранением его в качестве нового состояния ресурса; или,
с. отклоните запрос с ответом 415 (неподдерживаемый тип носителя), указывающим, что целевой ресурс ограничен «text / html», возможно, включающим ссылку на другой ресурс, который будет подходящей целью для нового представления.
HTTP не определяет точно, как метод PUT влияет на состояние исходного сервера, помимо того, что может быть выражено намерением запроса пользовательского агента и семантикой ответа исходного сервера. ...
Чтобы подвести итог этой публикации, вы должны либо использовать существующий тип мультимедиа, который позволяет обучить клиента обязательным или поддерживаемым входным параметрам, целевому местоположению, на которое следует отправить запрос, операции, которую необходимо использовать, а также типу мультимедиа запрос должен быть отформатирован или указан ваш собственный, который вы регистрируете в IANA. Последнее может быть необходимо, если вы хотите преобразовать входные данные вtext/csv
а затем загрузить представление CSV на сервер. Проверка должна произойти до того, как изменения будут применены к ресурсу. Фактический URI не должен быть релевантным для клиентов, кроме как для определения, куда отправить запрос и, как таковой, может быть свободно выбран вами, разработчиком сервиса. Выполнив эти шаги, вы в значительной степени получите свободу менять свою серверную часть в любое время, и клиенты не сломаются, как следствие, если они будут поддерживать используемые типы носителей.