【问题标题】:JSON Hyper-Schema: different schemas for GET and POSTJSON Hyper-Schema:GET 和 POST 的不同模式
【发布时间】:2014-11-05 05:28:37
【问题描述】:

我想描述一个 API,它的字段允许在发布项目时以不同的方式定义值,但只能以一种特定的方式在字段中输出。

例如,我可能想描述一个 API,其中可以像这样创建或更新项目:{"name": "Task", "due": "2014-12-31"} 或像这样:{"name": "Task", "due": {"$date": 1419984000000}},但它只会以第一种方式从 API 返回。

因此 POST/PUT 的架构可能是:

{
    "type": "object"
    "properties": {
        "name": {
            "type": "string"
        },
        "due": {
            "oneOf": [
                {
                    "type": "string",
                    "format": "date"
                },
                {
                    "type": "object",
                    "properties": {
                        "$date": {
                            "type": "number"
                        }
                    },
                    "required": ["$date"],
                    "additionalProperties": false
                }
            ]
        }
    }
}

而通过 GET 访问的架构会简单得多:

{
    "type": "object"
    "properties": {
        "name": {
            "type": "string"
        },
        "due": {
            "type": "string",
            "format": "date"
        }
    }
}

API 的使用者最好知道他们只需要考虑一种可能的输出方法,而不是所有的输出方法。

是否有任何公认的标准方法来指定 JSON 超模式上下文中的不同模式?我曾考虑通过"links" 属性指定这些差异,但我不知道"rel" 我会在什么下定义这些架构,而且看起来非常不标准。

【问题讨论】:

    标签: json jsonschema


    【解决方案1】:

    如果我理解正确,并且您想为每个操作指定一个架构,您可以使用标准超架构来完成。让我们看一下 post 操作的示例:

    {
      "description": "create an item.",
      "href": "/items",
      "method": "POST",
      "rel": "create",
      "schema": {
        "$ref": "#/api/createitem"
      },
      "title": "Create an item"
    }
    

    所需的实际架构通过“$ref”在“schema”属性中引用。

    如果您还想描述响应类型,则可以使用“targetSchema”属性。请注意,这只是建议性的(因为它是explained in the docs

    【讨论】:

    • 对,但是这个("create")只用于创建一个项目,而不是用于更新一个项目,"update" 不在标准中。
    • 更新不是有效的关系类型。请查看以下 RFC:rfc-editor.org/rfc/rfc5988.txt 我认为您将关系类型与 CRUD 操作混淆了。看来您需要 "rel":"self" 和 "href": "{id}" 或其他标识要更新的资源的 URI。
    • 我想标准关系应该是"edit",尽管那个关系也很模糊。如果 "rel": "self" 可以重复两次(我不确定是否可以),可能会有一个正常的用 "method": "GET" 和一个用方法 "POST" 进行更新。
    • 你可以重复。 GET 可以有“self”、“instances”和许多其他关系类型。是的,例如,“rel”:“edit”对于“PUT”操作将是一个不错的选择。显然需要更多关于此的文档和示例(json-schema.org 中没有超模式示例!!)。我所知道的最好的实用来源是 Heroku 家伙的工作:blog.heroku.com/archives/2014/1/8/…
    • 我的意思是重复,因为“rel”:“self”用不同的方法出现两次。 Heroku 使用 "rel": "update"。
    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2015-06-06
    相关资源
    最近更新 更多