我有一个示例json:
{
"type": "persons",
"id": 2,
"attributes": {
"first": "something",
"second": "something else"
}
}
Run Code Online (Sandbox Code Playgroud)
我必须为它制作一个模式(使用JSON API规范和JSON模式文档):
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"type": {
"type": "string",
"pattern": "^persons$"
},
"id": {
"type": "integer"
},
"attributes": {
"type": "object",
"properties": {...}
}
},
"required": ["type", "id", "attributes"]
}
Run Code Online (Sandbox Code Playgroud)
问题是:如果"类型"唯一可接受的值是"人",我应该使用模式模式(如上所述)还是枚举类似
"enum": ["persons"]
Run Code Online (Sandbox Code Playgroud)
我无法从文档中得到任何明确的答案,尽管在规范枚举中的示例用于单个值.你有什么看法?
根据 JSON API 规范,我们应该使用过滤器查询参数来过滤控制器中的记录。filter 参数实际上是什么并没有真正指定,但由于它应该能够包含多个搜索条件,显而易见的事情是使用散列。
问题是,我似乎经常在不同类型记录的控制器操作中重复自己。
以下是仅包含 id 列表(以获取多个特定记录)的过滤器的情况。
def index
if params[:filter] and params[:filter][:id]
ids = params[:filter][:id].split(",").map(&:to_i)
videos = Video.find(ids)
else
videos = Video.all
end
render json: videos
end
Run Code Online (Sandbox Code Playgroud)
对于嵌套属性检查,我想我可以使用fetchorandand但它看起来仍然不够干燥,而且我仍然在不同的控制器上做同样的事情。
有什么方法可以让这看起来更好,而不是重复我自己吗?
有很多超媒体可用于 Restful api。我不确定哪一个适合哪种情况。这是我第一次尝试 Restful api,所以我无法预见使用它的问题和优势。我想要的是可以查询并且还支持批量(特别是对于 GET 请求)。
Odata 似乎功能齐全,也是绿洲标准,但对我来说似乎有点过分了。其查询能力灵活但复杂。更重要的是,没有任何 odata 4 的 php 实现。如果我使用它,我需要自己做。我现在正在努力避免这种情况。
哈尔似乎太简单了,无法做任何事情。
集合+json看起来不错。但貌似不具备任何批量操作能力
jsonapi:看起来很简单。兼具查询能力和批量操作(带扩展)。但不支持GET请求的批量操作。也处于稳定状态。但我还找不到任何关于它的评论。
您对此有什么经验?我应该如何在其中选择超媒体?任何见解都会有所帮助。我还想听听除此之外的任何其他超媒体。
目前我对 json-api 和 collection+json 感到困惑。
我的服务器有一个 json 数据:
{
"post": {
"id": 1,
"title": "Progressive Enhancement is Dead",
"comments": ["1", "2"],
"links": {
"user": "/people/tomdale"
}
},
"meta": {
"total": 100
}
}
Run Code Online (Sandbox Code Playgroud)
看起来完全像文档(https://guides.emberjs.com/v2.5.0/models/handling-metadata/)我尝试获取元对象但没有成功
export default Ember.Route.extend({
model() {
var data = this.store.findAll('post');
data.then((result) => {
let meta = result.get('meta');
console.log(meta); //this return me undefined
})
return data;
}
});
Run Code Online (Sandbox Code Playgroud) 问题是关于JSON API规范以及请求的正确处理方式(我正在使用ruby on rails和json api resources gem,但这还是一个普遍的问题,我知道如何实现它,我只想遵循JSON的规则API位于:http : //jsonapi.org/format/)
情况一:
www.library.com/shelves?include=books情况2:
我想获取所有书籍,但仅获取标记为未读的书籍
我应该使用的get是:
www.library.com/books?filter[unread]=true
设计包含未读书籍的所有书架的要求的正确方法是什么?
想不通这个
www.library.com/shelves?include=books&filter[books.unread]=true ?
www.library.com/shelves?include=unread_books?<-必须指定其他资源,即未读的书
www.library.com/shelves?filter[books.unread]=true ?
最正确的方法是什么?
编辑
与我的技术负责人和其他一些程序员交谈后,在这种情况下,最优先选择第一个选项
我看到关于 Rails 5、活动模型序列化器和 json-api 适配器的奇怪行为。
\n\n给定以下带有Rolify gem 的用户模型:
\n\nclass User < ActiveRecord::Base\n #\n # Gem Includes\n #\n rolify\n\n\n # Include devise modules.\n devise :database_authenticatable,\n :recoverable, :rememberable, :trackable, :validatable\n include DeviseTokenAuth::Concerns::User\n\n #\n # Callbacks\n #\n after_create :assign_default_role\n\n #\n # Attributes\n #\n attr_accessor :remote_image\n\n #\n # Validations\n #\n validates :name, presence: true, length: {in: 1..100}\n validates :last_name, presence: true, length: {in: 1..100}\n validates :role_ids, presence: true, on: :update\n\n #\n # Relations\n #\n belongs_to :current_scenario, class_name: "Scenario"\n\n\n #\n …Run Code Online (Sandbox Code Playgroud) ruby-on-rails active-model-serializers json-api ruby-on-rails-5
如果客户端请求我的 REST 应用程序中不存在的资源,例如
\n\nhttp://localhost:8080/app/foo/1\nRun Code Online (Sandbox Code Playgroud)\n\n并且该 id 不存在 Foo 资源,我应该返回 404 错误代码吗?或者我应该返回 200 ,主体为{"data": null }?
从 ember 数据中读取这个线程让我觉得我应该返回 404。
\n\n但是当我从 JSONAPI 规范中读到这段话时,我觉得我应该返回{"data " : null}:
\n\n\n主要数据必须是:
\n\n\n
\n- 单个资源对象、单个资源标识符对象或 null(对于针对单个资源的请求)
\n- 资源对象数组、资源标识符对象数组或空数组 ([]),用于针对资源集合的请求
\n
因为这个案例似乎针对的是单一资源。
\n\n在解析数据部分它说:
\n\n\n\n\n服务器必须使用 200 OK 响应来响应成功获取单个资源或资源集合的请求。
\n
“成功”是什么意思?如果查询没有找到任何内容,因为那里没有条目,则查询运行并获得了准确的结果,是否成功?
\n\n同一部分的下面是:
\n\n\n\n\n仅当请求的 URL 可能对应于单个资源但当前不对应于\xe2\x80\x99t 时,null 才是合适的响应。
\n
我不清楚这是什么意思。
\n\n那么它是哪一个以及为什么?
\n\n(这并不是专门针对 ember-data,我想澄清一下我应该做什么才能符合规范。我只提到 ember-data,因为它似乎是 …
我正在使用 JSON:API 规范在 Laravel 中实现 API。
其中我有一个资源,我们称之为池塘,与另一个资源具有多对多关系,我们称之为鸭子。
根据 JSON:API 规范,为了删除这种关系,我应该使用 DELETE /ponds/{id}/relationships/ducks端点,并请求以下正文:
{
"data": [
{ "type": "ducks", "id": "123" },
{ "type": "ducks", "id": "987" }
]
}
Run Code Online (Sandbox Code Playgroud)
这是由 PondRemoveDucksRequest 处理的,如下所示:
<?php
...
class PondRemoveDucksRequest extends FormRequest
{
public function authorize()
{
return $this->allDucksAreRemovableByUser();
}
public function rules()
{
return [
"data.*.type" => "required|in:ducks",
"data.*.id" => "required|string|min:1"
];
}
protected function allDucksAreRemovableByUser(): bool
{
// Here goes the somewhat complex logic determining if the user is authorized
// …Run Code Online (Sandbox Code Playgroud) 我正在为我的 API 实现 OpenAPI-3.0 规范,并且我计划使用稀疏字段集作为 GET 的参数。使用 style=deepObject 的参数示例有点稀疏,所以我不确定我是否完全正确。
- in: query
name: fields
style: deepObject
schema:
type: object
additionalProperties:
type: string
Run Code Online (Sandbox Code Playgroud)
我可以结合 deepObject 和 additionalProperties 选项吗?
我想支持这样的灵活查询参数输入:
GET /articles?include=author&fields[articles]=title,body&fields[people]=name
但我不想为每个资源和字段拼出每个选项。
我想创建一组 REST API 端点来公开各种数据源。我希望我的端点符合Richardson 成熟度模型,特别是对 HATEOAS 的支持。
我查看了JSON-LD和JSON:API,它们似乎都很合适,因为它们都可以同等支持 REST 和 HATEOAS,但是 JSON:API 还有许多其他功能,这些功能更像“gRPC” '。
与使用 JSON-LD 相比,使用 JSON-LD 有什么明显的优势吗?JSON:REST 端点的 API?适用于 REST 的功能差异有哪些?
json-api ×10
json ×3
rest ×3
dry ×1
ember-data ×1
ember.js ×1
enums ×1
hateoas ×1
hypermedia ×1
javascript ×1
json-ld ×1
jsonschema ×1
laravel ×1
odata ×1
openapi ×1
php ×1
rails-api ×1