标签: json-api

请求成功但有警告消息时,合适的HTTP状态代码是什么?

在正确使用REST时,当请求成功但有警告消息时,什么是适合的HTTP状态代码?

在我们的情况下; 客户端是在浏览器上运行的Web应用程 我们更喜欢以下状态代码:

  • 成功请求处理时的HTTP 200,201,204
  • 请求违反某些业务规则时的HTTP 422
  • 处理请求时发生意外异常时的HTTP 500

但是,当请求成功处理时,我们无法确定应使用哪个状态代码,但是需要向客户端发送一些信息或警告消息?

rest http-status-codes http-status json-api

9
推荐指数
1
解决办法
6399
查看次数

EmberJS在有效负载JSONAPI中嵌入了项目

Ember      : 1.13.3
Ember Data : 1.13.5
jQuery     : 1.11.3
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用来自我的EmberJS客户端的ember-data向我的服务器发送JSON有效负载.我想在保存项目时将整个对象图发送到服务器,因为我不想发送多个请求.我不介意发送多个请求,但我担心如果其中一个请求在中间失败并且服务器上的数据不正确会发生什么.

我想使用JSONAPI(http://jsonapi.org/format/#document-compound-documents),因为它正在成为Ember中的默认适配器.此外,还有一些C#库可以处理这种格式,因此我认为它非常简单.但是,在阅读规范之后,如果没有id,我似乎无法嵌入对象.即使我{ async: false, embedded: 'always' })在DS.attr上指定,EmberJS也不会将子对象附加到JSON .

我的问题是:如果应用程序的使用方式是在客户端创建对象图,那么如何使用JSONAPI格式将整个对象图发送到服务器?我是否必须在客户端生成ID以满足JSONAPI标准?然后,一旦他们到达服务器,只需忽略它们,以便用ORM生成的id保存它们?

这是我的labelGroup模型:

import DS from 'ember-data';

export default DS.Model.extend({
  name: DS.attr('string'),
  labels: DS.hasMany('label-model', { async: false, embedded: 'always' })
});
Run Code Online (Sandbox Code Playgroud)

这是我的项目模型:

import DS from 'ember-data';

export default DS.Model.extend(DS.EmbeddedRecordsMixin, {
  name: DS.attr('string'),
  labelGroups: DS.hasMany('labelGroup', { async: false, embedded: 'always'})

});
Run Code Online (Sandbox Code Playgroud)

这是我在项目上执行save()后得到的POST:

{
  "data":{
    "attributes":{"name":"Project"},
    "relationships":{
      "label-groups":{
        "data":[
         {"type":"label-groups","id":null},
         {"type":"label-groups","id":null},
         {"type":"label-groups","id":null},
         {"type":"label-groups","id":null},
         {"type":"label-groups","id":null},
         {"type":"label-groups","id":null},
         {"type":"label-groups","id":null}
       ]
     }
   },
   "type":"label-projects"
  } …
Run Code Online (Sandbox Code Playgroud)

ember.js ember-data json-api

8
推荐指数
1
解决办法
810
查看次数

WP REST API从帖子类型中获取帖子

如何使用WP REST API(v1或v2)获取特定自定义帖子类型的所有帖子?我对此很新,并试图了解如何做到这一点.

我目前正在使用WP REST API v2并设法使用此方法获取所有帖子类型的列表

http://domain.com/wp-json/wp/v2/types
Run Code Online (Sandbox Code Playgroud)

然后设法得到我感兴趣的帖子类型

http://domain.com/wp-json/wp/v2/types/the-icons-update
Run Code Online (Sandbox Code Playgroud)

如何获取该特定内容类型的所有帖子?

我试过了

http://domain.com/wp-json/wp/v2/posts?filter[post_type]=the-icons-update
Run Code Online (Sandbox Code Playgroud)

但它返回一个空数组(我想它会返回默认帖子,在我的网站上只有我试图检索的自定义帖子类型中的帖子).

我是如何注册帖子类型的?

function custom_post_type() {
$labels = array(
    'name'               => _x( 'The Icons Update', 'post type general name' ),
    'singular_name'      => _x( 'The Icons Update', 'post type singular name' ),
    'add_new'            => _x( 'Add Page', 'magazine' ),
    'add_new_item'       => __( 'Add New Page' ),
    'edit_item'          => __( 'Edit Page' ),
    'new_item'           => __( 'New Page' ),
    'all_items'          => __( 'All Pages' ),
    'view_item'          => __( 'View Page' …
Run Code Online (Sandbox Code Playgroud)

php wordpress custom-post-type json-api wordpress-rest-api

8
推荐指数
1
解决办法
4900
查看次数

使用JWT和JSONAPI进行身份验证

我正在使用以下技术/方法实现REST API:

我想实现身份验证端点,它应该在JSONAPI格式的POST请求中接收用户名和密码,并以JSONAPI格式返回JWT令牌.但我发现有一些矛盾不允许我100%RESTful:

让我们命名端点/tokens,因为它实际上创建了令牌.响应也是类型的资源tokens,例如:

{
  "data": {
    "type": "tokens",
    "attributes": {
      "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEifQ.ivJ5P23wqVo3w31flg3aOu7er--Ijght_RrBf_MuqsU",
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但请求怎么样?username并且password是用户的属性,但应将它们发送到/tokens端点.如果我将users资源发送到/tokens端点,那就没有多大意义了.

有没有办法解决这个问题,遵循JSONAPI并保持API的意义?

authentication rest jwt json-api

8
推荐指数
1
解决办法
1264
查看次数

在JSON API中指定排序顺序

我的团队最近采用了json api惯例.在api排序的文档中没有解决.

然而,它们确实在推荐页面中解决了过滤问题,但在我看来,排序不是过滤的一部分,因为过滤用于减少集合,而排序用于重新排序集合.

鉴于json api惯例,我想知道:

  • 分类是api还是客户的责任?
  • 如果它应该是api的责任,是否有任何指导结构化url来处理排序?

javascript api json-api

8
推荐指数
1
解决办法
3262
查看次数

在我的 .Net 核心 API 中向 Swagger 添加自定义序列化程序

我使用来自jsonapi.orgJSONAPI规范,然后我使用JsonApiSerializer来完成 JSONAPI 规范,所以我的响应和请求正文如下所示:

{    
    "data": {
    "type": "articles",
    "id": "stringId",
    "attributes": {
      "title": "JSON:API paints my bikeshed!"
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个实体“文章”,它看起来像:

public class Article
{
     public string Id { get; set; }
     public string title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用Swashbuckle Swagger来记录我的 API,但在Swagger UI 中,我的示例请求和响应正文如下所示:

{
     "id": "string",
     "title": "string"
}
Run Code Online (Sandbox Code Playgroud)

我认为 swagger 忽略了JsonApiSerializer,有没有办法更改 swagger 的默认序列化程序并使用我自己的序列化程序?

我的 Startup.cs 看起来像:

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            this.Configuration = …
Run Code Online (Sandbox Code Playgroud)

c# swagger-ui json-api swashbuckle asp.net-core

8
推荐指数
1
解决办法
1644
查看次数

Rails 4.2 - Grape - IOError:未打开以供阅读

我正在使用Grape on Rails 4.2构建API.这是GitHub上的回购链接.

在前端,我有一个用EmberJS构建的JavaScript应用程序.这里也是GitHub上回购的链接.

我已经更新了以下宝石,以便我可以按照JSON API标准格式化我的API的响应,这似乎需要更新到Ember 1.13,然后更新到Ember 2.0.

gem "active_model_serializers", '0.10.0.rc2'
gem "grape"
gem "grape-active_model_serializers", :git => 'https://github.com/jrhe/grape-active_model_serializers.git'
Run Code Online (Sandbox Code Playgroud)

之后,当我调用API时出现以下错误:IOError:未打开进行读取

根据我在这里和那里收集的信息,我怀疑这与我格式化JSON的方式存在冲突.

在default.rb中,当我对此行进行注释时,继承所有API控制器的文件:

formatter :json, Grape::Formatter::ActiveModelSerializers
Run Code Online (Sandbox Code Playgroud)

我不再有任何错误,但显然响应没有序列化.

我的问题是:

  • 你知道我怎么能解决这个问题吗?
  • 您是否认为使用Grape在我的Rails应用程序中构建API是相关的?随着Rails 5的到来,使用rails-api并重写整个应用程序并不是更好吗?我的意思是,我刚开始,这可能是正确的时间......

如果您需要更多信息,请与我们联系.

在此先感谢您的帮助.

json ruby-on-rails ember.js grape-api json-api

7
推荐指数
1
解决办法
820
查看次数

具有权限限制字段的 JSON API REST 端点

具有权限限制字段的 JSON API REST 端点

我正在开发符合 JSON API 的 REST api。某些端点包含某些用户应限制(只读或不可用)的字段。

构建 api 以允许某些用户访问某些字段而其他用户不能访问的最佳方法是什么?“最好”,我的意思是:

  • 最符合 REST 标准,最好是 JSON API 标准
  • 在代表使用 API 的客户防止错误和混淆方面最清晰

我正在考虑以下选项,每个选项都有其关注点/问题。对于任何其他解决方案,我将不胜感激!

选项 1:对于没有权限的用户,在受限字段上返回 null

  • 每个用户将返回不同的数据值。这是严格的反 REST 吗?
  • null 表示“空值”和 null 表示“您无权访问此”之间缺乏区别
  • 在 REST/JSON API 架构中,端点是否可以根据权限为每个用户返回不同的数据?我的印象是这与基于资源的 REST 架构的精神背道而驰,但我在任何文档或标准(例如 JSON API)中找不到任何具体指向的内容。也适用于选项 2。
  • 是否有任何范例可以在资源的元数据中添加某种“您无权访问”标志?

选项 2:完全排除没有权限的用户的受限字段

  • 每个用户将返回不同的数据值。这是严格的反 REST 吗?
  • 尝试检索字段值时,客户端中可能出现“未定义”错误

选项 3:将受限字段移动到另一个端点,可作为 ?include='field_name' 关系供具有权限的人使用

  • 示例:/api/entity 包含仅对管理员用户可用的属性字段“成本”。管理员用户可以通过 GET /api/entity?include=cost 请求成本数据。对于所有用户,“成本”作为资源对象中的关系公开,具有“类型”和“id”。
  • 这是我倾向于的选项。这里的主要缺点是端点混乱。我有很多关系需要制作成单独的端点,只是为了支持现有端点上的权限隔离数据。
  • 在 JSON API 规范中,我无法确定端点仅作为关系存在是否可以,例如我们可以拥有 /api/entity/1/cost,但没有顶级 api 端点 /api/成本。我的假设是,如果资源具有“类型”(在这种情况下,关系类型为“成本”),它也必须位于顶级端点上。
  • 在这种情况下,如果非管理员用户尝试 GET /api/entity?include=cost 或 GET /api/cost/:id,客户端可能会收到 401: Unauthorized 错误响应

注意:我已经构建了一个单独的权限架构,以便客户端可以在发出任何请求之前根据顶级端点确定用户拥有哪些 …

restful-authentication restful-architecture json-api

7
推荐指数
1
解决办法
1723
查看次数

使用javascript的json api上传到谷歌云商店

我试图使用gapi上传图片到谷歌云存储.目前的代码,我是

<script src="https://apis.google.com/js/api.js"></script>
<script type="text/javascript">
var imgData = null;

function getImage() {
    navigator.camera.getPicture(onSuccess, onFailure, {
        destinationType: navigator.camera.DestinationType.FILE_URI,
        sourceType: navigator.camera.PictureSourceType.PHOTOLIBRARY
    });

    function onSuccess(imageURI) {
        imgData = encodeImageUri(imageURI);
        var contentLen = imgData.length;
        gapi.load('client', start);
    }

    function onFailure(message) {
        alert("Get image failed: " + message);
    }
}

function start() {
    // 2. Initialize the JavaScript client library.
    console.log('firing google storage api');
    gapi.client.init({
        'apiKey': 'XXX-XX'
    }).then(function() {
        // 3. Initialize and make the API request.
        console.log('api initialized');
        var request = …
Run Code Online (Sandbox Code Playgroud)

javascript client-library google-cloud-storage json-api gapi

7
推荐指数
1
解决办法
896
查看次数

如何根据 Ruby 的 OpenApi 规范验证 JSON 负载?

我有根据jsonapi.org指南构建的 HTTP 请求负载:

{
  "data": {
    "type": "employee",
    "attributes": {
      "firstName": "John",
      "lastName": "Doe",
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我有这个有效负载的OpenApi规范 (yaml):

employee: 
  type: object
  required: [data]
  properties:
    data:
      type: object
      properties:
        type:
          type: string
          enum: [employee]
        attributes: 
          type: object
          required: [firstName, lastName]
          properties:
            firstName:
              type: string
              example: 'John'
            lastName:
              type: string
              example: 'Doe'
Run Code Online (Sandbox Code Playgroud)

我想要的是根据规范(来自 Ruby/Rails)验证有效负载。

存在openapi3_parser gem,但它似乎只能验证规范,而不能验证实际的有效负载。

然后,还有jsonapi.org 有效负载反序列化器,但它们似乎根本不关心 OpenApi 正式规范。

我使用 OpenApi 来描述有效负载,因为我通过 Swagger 免费获得 http API 文档。

ruby json-api openapi

7
推荐指数
1
解决办法
4307
查看次数