Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Можете привести какие-то аргументы в защиту этого утверждения
Я принципиально всем «выкаю»
люди решили почему-то, что обязательно нужно иметь ссылки в API, но API используют машины и они не будут принимать никаких решений на основании содержимого ответа, они могут составить ссылки самостоятельно, в отличие от «кликающего пользователя»
одновременно с представлением ресурса получить и список доступных текущему пользователю операций.Ну и что, скажем, мобильное приложение будет с этой информацией по «доступным пользователю действиям» делать? Кнопки дорисовывать автоматически? Вот более развёрнутая мысль — Best Practices for Designing a Pragmatic RESTful API: Should you HATEOAS?
(люди решили почему-то, что обязательно нужно иметь ссылки в API, но API используют машины и они не будут принимать никаких решений на основании содержимого ответа, они могут составить ссылки самостоятельно, в отличие от «кликающего пользователя»).
Кстати, интерфейсы взаимодействия в Eve меня пугают — JSON в GET параметрах выглядит странно
Всё это дело работает до поры до времени, пока у вас какой-нибудь хитрый случай не вылезет, где простым SELECT/UPDATE не отделаешься и начнётся «сладкая жизнь».
Это ещё не говоря о том, что dict с конфигом разрастается в реальном проекте мама не горюй и подстветка синтаксиса такому коду уже не поможет.
Они всегда будут принимать решение на основании содержимого ответа. HATEOAS даёт возможность не плодить v1/v2/v3/v1000, для случаев, когда там просто изменился один URL. Можно «хардокить» везде ссылки и пересобирать мобильные приложение и фронтенд каждый раз, если так удобнее.Для случая просто смены URL я оставляю старый URL, в документации помечаю deprecated, а в следующей версии, когда других изменений уже накопилось много — удаляю.
Если говорить о каком-нибудь инструменте автоматического генерирования админки, то без HATEOAS там вообще обойтись не получится.По The OpenAPI Specification (fka The Swagger Specification) строить админку куда легче, чем ходить по всем URL.
Вы документацию читали? Есть «хуки» на каждое событие, если их их мало, то есть все возможности Flask. Вы же сами дальше пишите, что Flask используете.Хуки хуками, а бизнес логику куда девать? Её не существует? Самое первое препятствие — роли пользователей, в частности «владелец» объекта и «менеджер», который имеет доступ в том числе ко всем объектам своих подчинённых (в простом случае). Вот так я это реализовал в своём примере — github.com/frol/flask-restplus-server-example/blob/master/app/modules/teams/resources.py#L79
Или вам удобнее модели в Django кодом описывать?Да, почему-то в коде мне их удобнее описывать, могу использовать наследования, например: github.com/frol/flask-restplus-server-example/blob/master/app/modules/teams/schemas.py
Для случая просто смены URL я оставляю старый URL, в документации помечаю deprecated, а в следующей версии, когда других изменений уже накопилось много — удаляю.
По The OpenAPI Specification (fka The Swagger Specification) строить админку куда легче, чем ходить по всем URL.
Хуки хуками, а бизнес логику куда девать? Её не существует? Самое первое препятствие — роли пользователей, в частности «владелец» объекта и «менеджер», который имеет доступ в том числе ко всем объектам своих подчинённых (в простом случае).
[
{ "op": "test", "path": "/a/b/c", "value": "foo" },
{ "op": "remove", "path": "/a/b/c" },
{ "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] },
{ "op": "replace", "path": "/a/b/c", "value": 42 },
{ "op": "move", "from": "/a/b/c", "path": "/a/b/d" },
{ "op": "copy", "from": "/a/b/d", "path": "/a/b/e" }
]
"patch": {
"description": "**PERMISSIONS: Owner/Supervisor/Admin may execute this action.**",
"operationId": "patch_team_by_id",
"parameters": [
{
"in": "path",
"name": "team_id",
"required": true,
"type": "integer"
},
{
"in": "body",
"name": "body",
"required": true,
"schema": {
"items": {
"properties": {
"op": {
"enum": [
"add",
"test",
"remove",
"replace"
],
"location": "json",
"type": "string"
},
"path": {
"enum": [
"/title"
],
"location": "json",
"type": "string"
},
"value": {
"location": "json",
"type": "string"
}
},
"required": [
"op",
"path"
]
},
"location": "json",
"type": "array"
}
}
],
"responses": {
"200": {
"description": "Success",
"schema": {
"$ref": "#/definitions/DetailedTeamSchema"
}
},
"401": {
"description": "Authentication with teams:write scope(s) is required",
"schema": {
"$ref": "#/definitions/401HTTPErrorSchema"
}
},
"403": {
"description": "Owner/Supervisor/Admin may execute this action.",
"schema": {
"$ref": "#/definitions/403HTTPErrorSchema"
}
},
"404": {
"description": "Team not found.",
"schema": {
"$ref": "#/definitions/404HTTPErrorSchema"
}
},
"409": {
"description": "A conflict happened while processing the request. The resource might have been modified while the request was being processed.",
"schema": {
"$ref": "#/definitions/409HTTPErrorSchema"
}
},
"422": {
"description": "The request was well-formed but was unable to be followed due to semantic errors.",
"schema": {
"$ref": "#/definitions/422HTTPErrorSchema"
}
}
},
"security": [
{
"oauth2": [
"teams:write"
]
}
],
"summary": "Patch team details by ID",
"tags": [
"teams"
]
}
но потом клиента к нему писать придётся самому и работать с особенностями Eve на клиенте — тоже
from petstore_swagger_api import PetApi
pet_api = PetApi()
available_pets = pet_api.find_pets_by_status(status='available')
http htp://127.0.0.1:5000/
отрабатывает нормально, а http http://127.0.0.1:5000/users выдаёт «500 Internal Server Error»Если человек вам не может объяснить даже трудную для понимания тему простым языком, значит, он сам не до конца понимает о чём говорит.
Упс, ошибка. Я выше упоминал о целостности данных.ссылка битая.
Полноценный REST API для перфекционистов за 5 минут