我在职业生涯中使用过OData很多,现在很少有来自不同团队的同事建议我们转向JsonAPI和GraphQL,因为它与微软无关.我对这两种查询语言都没有多少经验.据我所知,OData是Salesforce,IBM,Microsoft使用的标准,它非常成熟.为什么要切换到JsonAPI和/或GraphQL?有真正的好处吗?JsonAPI和GraphQL是新标准吗?基于流行度改变公共api实现似乎毫无用处,尤其是在没有大的好处时.
有人可以赐教吗?
我使用Ember 1.13.7和Ember Data 1.13.8,默认情况下使用JSON-API标准格式化发送到API和从API接收的有效负载.
我想使用Ember Data的内置错误处理,以便向用户显示红色"错误"表单字段.我根据JSON-API标准格式化了我的API错误响应,例如
{"errors":[
{
"title":"The included.1.attributes.street name field is required.",
"code":"API_ERR",
"status":"400",
}
]}
Run Code Online (Sandbox Code Playgroud)
当我尝试保存我的模型时,正确执行错误回调.如果我在Ember Inspector中查看,我可以看到模型的"isError"值设置为true但我看不出Ember Data应该如何知道模型中哪个字段是错误状态的字段?我从官方JSON-API页面(http://jsonapi.org/format/#errors)中看到,您可以在错误响应中包含"源"对象:
source:包含对错误源的引用的对象,可选地包括以下任何成员:
指针:请求文档中关联实体的JSON指针[RFC6901] [例如,主数据对象的"/ data",或特定属性的"/ data/attributes/title"].
parameter:一个字符串,指示导致错误的查询参数.
但这是我应该做的,以便告诉Ember Data哪些字段应该标记为处于错误状态?
如果有人能帮助阐明这一点,我将不胜感激.
谢谢.
我正在考虑使用JSONAPI标准来设计我们的API.这个API必须能够做的一件事是接受一个复合文档(深层几层)并创建它.根对象拥有所有后代('to-many'关系),服务器在那一点上什么都不知道,所以客户端不可能提供id.
这是规范支持还是客户端必须按顺序为文档中的每个对象发出http请求?
我一直在阅读jsonapi的文档,我无法理解这是如何实用的.根据该文件的添加注释到文章的评论必须已经存在.
POST /articles/1/relationships/comments HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"data": [
{ "type": "comments", "id": "123" }
]
}
Run Code Online (Sandbox Code Playgroud)
这只是一个糟糕的例子,或者规范是否真的希望您在发出上述请求以将其与总共2个请求相关联之前发出创建与实体无关的注释的请求?
您似乎更希望发出如下请求:
POST /comments HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"data": {
"type": "comments",
"attributes": {
"body": "blah blah blah"
},
"relationships": {
"article": {
"data": { "type": "articles", "id": "45" }
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者更好的是:
POST /articles/45/relationships/comments HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"data": [
{
"type": "comments",
"attributes": {
"body": "blah blah …Run Code Online (Sandbox Code Playgroud) 为什么以下JSONAPI资源中的self和related引用不同?他们不是指向相同的资源吗?去/articles/1/relationships/tags和之间有什么区别/articles/1/tags?
{
"links": {
"self": "/articles/1/relationships/tags",
"related": "/articles/1/tags"
},
"data": [
{ "type": "tags", "id": "2" },
{ "type": "tags", "id": "3" }
]
}
Run Code Online (Sandbox Code Playgroud) 我试图使用gem将模型的序列化版本作为参数发送到视图 ActiveModel::Serializer::ArraySerializer.new(@admins, each_serializer: AdminSerializer).as_json
#app/serializers/admin_serializer.rb
class AdminSerializer < ActiveModel::Serializer
attributes :id, :email, :access_locked?
end
#app/controllers/dashboard/admins_controller.rb
def index
@search = Admin.search(params[:q])
@admins = @search.result(:distinct => true).page(params[:page]).per(10)
@page_entries_info = view_context.page_entries_info @admins
# render json: @admins
respond_to do |format|
format.html
format.js
format.json {render json: @admins}
end
end
#app/views/dashboard/admins/index.html.erb
<%= debug (ActiveModel::Serializer::Adapter.adapter_class(:json_api).new(ActiveModel::Serializer.serializer_for(@admins.first).new(@admins.first),{}).to_json) %>
<%= debug (@admins.all.map{|admin| AdminSerializer.new(admin).to_json}) %>
Run Code Online (Sandbox Code Playgroud)
以上调试产生以下响应:
--- '{"data":{"id":"1","type":"admins","attributes":{"email":"tech@bluesapling.com","access_locked?":false}}}' //returned by the first debug
---
- '{"object":{"id":36,"email":"aubrey_schmitt@feeneykoch.io","created_at":"2016-03-28T05:15:17.546Z","updated_at":"2016-03-28T05:15:17.546Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":20,"email":"alysa_johnston@thompson.io","created_at":"2016-03-28T05:15:16.304Z","updated_at":"2016-03-28T05:15:16.304Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":22,"email":"kristofer.langosh@kunzeluettgen.com","created_at":"2016-03-28T05:15:16.459Z","updated_at":"2016-03-28T05:15:16.459Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":37,"email":"beryl_keler@wiza.biz","created_at":"2016-03-28T05:15:17.624Z","updated_at":"2016-03-28T05:15:17.624Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":5,"email":"wilhelmine_buckridge@crona.io","created_at":"2016-03-28T05:15:15.139Z","updated_at":"2016-03-28T05:15:15.139Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":14,"email":"edward_wisoky@corkery.net","created_at":"2016-03-28T05:15:15.838Z","updated_at":"2016-03-28T05:15:15.838Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":27,"email":"leonor@jerde.biz","created_at":"2016-03-28T05:15:16.848Z","updated_at":"2016-03-28T05:15:16.848Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":2,"email":"carley@wyman.net","created_at":"2016-03-28T05:15:14.873Z","updated_at":"2016-03-28T05:15:14.873Z"},"instance_options":{},"root":null,"scope":null}'
- …Run Code Online (Sandbox Code Playgroud) json ruby-on-rails active-model-serializers ruby-on-rails-4 json-api
我正在尝试遵循JSON API.我需要公开对嵌套资源的CRUD访问:产品评论.
在使用JSON API之前,我希望有一个这样的REST接口:
GET /products/:product_id/reviews - list reviews for a product
POST /products/:product_id/reviews - add a review for a product
PATCH /products/:product_id/reviews/:id - update a review for a product
DELETE /products/:product_id/reviews/:id - delete a review for a product
Run Code Online (Sandbox Code Playgroud)
我在规范中看到一些像这样的嵌套结构:
例如,照片评论的网址将为:
/photos/1/comments
但我不确定这种结构是否适合所有行动.
一方面,POST /products/:product_id/reviews如果我要在评论数据下指定POST主体中的产品,那么创建似乎是多余的relationships.
另一方面,如果在删除评论时指定产品ID很有用(可能不是),那么这DELETE /products/:product_id/reviews/:id似乎是唯一理智的方式; 人们争论是否允许请求正文进行DELETE请求.
我可以为一些请求而不是其他请求嵌套:
GET /products/:product_id/reviews - list reviews for a product
POST /products/:product_id/reviews - add a review for a product
PATCH /reviews/:id - …Run Code Online (Sandbox Code Playgroud) 我正在使用 ruby on rails 编写 REST api。我使用json api作为构建 api 时使用的标准的指南。
我试图找出在 GET 请求中使用过滤的最佳方法。用于过滤的 json api建议仅包括完全等于的内容。例如。
GET /comments?filter[post]=1
Run Code Online (Sandbox Code Playgroud)
我将如何过滤大于、小于、不等于、喜欢、包含等?
我已经通过谷歌结果进行了大量搜索,但似乎没有进行过滤的最佳方式的标准。有一些建议,例如这个。
我正在寻找一个可靠的规范或标准,我可以专门为我的 api 过滤参考,因为 json api 规范在过滤方面非常有限。
我在使用Ember/Ember数据时遇到了一些错误.这是我的情景:
客户登陆/路线,Ember从中加载数据/api/v1/videos?limit=8.响应来自使用active_model_serializers的rails-api后端,可确保响应符合JSON API.现在商店已经加载了8个任意视频.
DOM中的每个视频组件都有一个指向用户页面的链接(视频belongsTo是用户和用户hasMany视频).
客户点击link-to导航到/users/1哪个代表ID为1的用户
该路由的模型挂钩只加载单个用户记录.用户记录具有以下有效负载:
Run Code Online (Sandbox Code Playgroud){ "data": { "id": "1", "relationships": { "videos": { "data": [], "links": { "related": "/api/v1/videos?user_id=1" } }, }, "type": "users" } }
问题是,ember不会自动发送请求/api/v1/videos?user_id=1(可能是因为类似的请求/api/v1/videos?limit=8已经发生).
如果我直接加载/users/1页面,那么Ember是智能的,并从/api/v1/videos?user_id=1端点自动加载数据.
我怀疑Ember被这样一个事实所迷惑,即对视频端点的类似请求已经发生了不同的查询参数.最终结果是我的应用程序没有在用户页面上显示任何数据.
解决此问题的一种方法是不使用链接/相关语法,而是填充"data": [],视频ID,这将导致ember发送n个视频的n个请求.这适用于大型应用程序,但用户页面可能包含数百个视频.
我怎样才能解决这个问题?
您可以看到,链接/相关结构的active_model_serializers设置应该专门为ember-data定制.
编辑:我试图摆脱data: []使用include_data falseactive_model_serializers没有帮助.
编辑2:这是有效载荷/api/v1/videos?limit=8:
{
"data": [
...
{
"attributes": {
...
}, …Run Code Online (Sandbox Code Playgroud) ruby-on-rails ember.js ember-data active-model-serializers json-api
使用 3.28,在检索我的模型之一上的关系时,我在 Ember Data 深处触发了一个断言。我可以很好地运行以下查询:
return this.store.findRecord('project', project_id)
Run Code Online (Sandbox Code Playgroud)
但是当我运行后续的
const monitors = await model.monitors;
Run Code Online (Sandbox Code Playgroud)
在我的路由的 afterModel() 中,触发了此断言。
我的模型看起来很标准:
export default class ProjectModel extends Model {
@attr('string') name;
@belongsTo('user') creator;
@attr('date') created;
@attr('date') changed;
@hasMany('domain-monitor') monitors;
}
export default class DomainMonitorModel extends Model {
@belongsTo('project') project;
@hasMany('page-monitor') pages;
@attr('string') protocol;
@attr('string') domain;
@attr('date') created;
@attr('date') changed;
}
Run Code Online (Sandbox Code Playgroud)
如果有人能指出问题出在哪里,我很乐意提交 MR 来改进此断言消息,希望将来能帮助某人摆脱困境。谢谢!