Как предоставить API проверки в спокойном режиме?
Я вообще поклонник дизайна RESTful API, но я не уверен, как применять принципы REST для API проверки.
предположим, что у нас есть API для запроса и обновления информации профиля пользователя (имя, адрес электронной почты, имя пользователя, пароль). Мы посчитали, что полезной частью функциональности для предоставления будет проверка, например, запрос, является ли данное имя пользователя действительным и доступным.
каковы ресурсы в этом случае? Какие коды состояния HTTP и / или заголовки должны быть использовали?
для начала, у меня есть GET /profile/validate который принимает параметры строки запроса и возвращает 204 или 400 если допустимо или недопустимо. Но validate - это явно глагол, а не существительное.
4 ответов:
тип вещи, которую вы описали, конечно, более RPC-стиль в своей семантике, но это не значит, что вы не можете достичь своих целей в спокойной манере.
нет
VALIDATEhttp глагол, так сколько значение вы можете получить от структурирования всего API вокруг этого? Ваша история сосредотачивается вокруг предоставления пользователям возможности определить, доступно ли данное имя пользователя - это звучит для меня как простая проверка поиска ресурсов -GET: /profile/username/...- если результат равен 404, то имя доступно.это подчеркивает, что эта проверка на стороне клиента-это просто сторона клиента. Это проблема пользовательского интерфейса, чтобы гарантировать, что данные проверяются на клиенте перед отправкой на сервер. Служба RESTful не дает ни малейшего представления о том, выполнял ли клиент проверку; она просто принимает или отклоняет запрос на основе своей собственной логики проверки.
REST не является всеобъемлющей парадигмой, он только описывает способ структурирования клиент-сервер система связи.
вы путаете REST с ориентацией ресурсов, в REST нет ничего, что говорит, что вы не можете использовать глаголы в URL-адресах. Когда дело доходит до дизайна URL-адрес, я обычно выбираю те, что более информативным, погоду-это существительное или глагол.
о вашем сервисе, что я бы сделал, это использовать тот же ресурс, который вы используете для обновления, но с
testпараметр querystring, поэтому когдаtest=1операция не выполнена, но вы можете использовать ее для возврата ошибок проверки.PATCH /profile?test=1 Content-Type: application/x-www-form-urlencoded dob=foo... и ответ:
HTTP/1.1 400 Bad Request Content-Type: text/html <ul class="errors"> <li data-name="dob">foo is not a valid date.</li> </ul>
мы столкнулись с той же проблемой. Наша аргументация для того, чтобы клиент отложил на сервер для проверки, заключалась в том, чтобы предотвратить несоответствие правил. Сервер должен проверить все, прежде чем действовать на ресурсы. Не было смысла кодировать эти правила дважды и иметь этот потенциал для их выхода из синхронизации. Поэтому мы придумали стратегию, которая, похоже, соответствует идее отдыха и в то же время позволяет нам просить сервер выполнить утверждение.
наш первый шаг состоял в реализации объекта метаданных, который может быть запрошен из службы метаданных (
GET /metadata/user). Этот объект метаданных затем используется для указания клиенту, как выполнять основные проверки на стороне клиента (requiredness, type, length и т. д.). Мы создаем большинство из них из нашей базы данных.вторая часть состоит из добавление нового ресурса под названием Анализ. Так, например, если у нас есть услуги:
GET /users/100мы создадим новый ресурс звонил:
POST /users/100/analysisресурс анализа содержит не только любые ошибки проверки, которые произошли, но и статистическую информацию, которая может быть актуальной, если это необходимо. Одним из вопросов, которые мы обсуждали, был вопрос о том, какой глагол использовать для ресурса анализа. Мы пришли к выводу, что это должен быть пост, как анализ создается в момент запроса. Однако, есть веские аргументы в пользу вам, а также.
Я надеюсь, что это полезно для других, пытающихся решить эту проблему тот же вопрос. Любая обратная связь по этому дизайну ценится.
это здорово, чтобы иметь проверку в REST API. Вам все равно нужна проверка, и вы не должны использовать ее на стороне клиента. В моем случае у меня просто есть соглашение в API, что специальный error_id представляет ошибки проверки, а в error_details есть массив сообщений об ошибках для каждого поля, которое имеет ошибки в этом вызове PUT или POST. Для examople:
{ "error": true, "error_id": 20301, "error_message": "Validation failed!", "error_details": { "number": [ "Number must not be empty" ], "ean": [ "Ean must not be empty", "Ean is not a valid EAN" ] } }Если вы используете тот же REST API для веб-и мобильных приложений, вам понравится возможность изменения проверка в обоих только путем обновления API. Особенно мобильные обновления займет более 24 часов, чтобы получить опубликованы на магазинах.
и вот как это выглядит в мобильном приложении:
ответ PUT или POST используется для отображения сообщений об ошибках для каждого поля. Это тот же вызов из веб-приложения с помощью React:
таким образом, все коды ответа REST API, такие как 200, 404 имеют they'R значит, так и должно быть. Ответы на вызовы PUT с 200, даже если проверка не выполняется. Если вызов проходит проверку ответ будет выглядеть так:
{ "error": false, "item": { "id": 1, "created_at": "2016-08-03 13:58:11", "updated_at": "2016-11-30 08:55:58", "deleted_at": null, "name": "Artikel 1", "number": "1273673813", "ean": "12345678912222" } }есть возможные изменения, которые вы могли бы сделать. Мне использовать его без error_id. Если tehre-это error_details, просто зациклите их, и если вы найдете ключ с тем же именем, что и поле, поместите его значение как текст ошибки в то же поле.


Comments