显示导航

将HAL与JSON视图结合使用

学习使用365bet地区构建可发现的API

s扎卡里·克莱因

365bet地区版本 3.3.1

365bet地区培训

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

在本指南中,您将探索东西365bet地区中使用JSON视图提供的JSON视图支持超文本应用程序语言365bet地区视图图书馆

超文本应用程序语言HAL是Internet草案,是一个进行中的标准工作约定,用于定义超媒体,例如指向JSON或XML代码中的外部资源的链接

维基百科

HAL的目的是使API变得可发现,它定义了一组约定,这些约定使您的API的使用者可以遵循资源之间的链接,并提供分页和其他方便的功能来探索API HAL是实施的一种流行标准帽子超媒体作为应用程序状态架构的引擎,是基础REST架构的扩展

HAL资源结构
图来自的HAL资源结构http无状态公司
要全面了解HAL,请查看以下URL的概述和规格http无状态合作规范html

365bet地区通过JSON视图提供对HAL的支持,JSON视图是365bet地区 Views库的一部分。您可以按照文档中的安装步骤在现有应用程序中使用此库,也可以使用休息api配置文件或前端配置文件之一角度的, 角度的反应扩展了休息api轮廓

在本指南中,我们使用了休息api的个人资料初始项目我们还包括一些通过我们的API公开的域类。如果您愿意,可以生成自己的项目,在这种情况下,您需要从最初的grails应用程序域到您自己的项目中,或直接使用初始与指南一起遵循的项目

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

如何完成指南

要开始,请执行以下操作

要么

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails使用hal和json视图初始的指南

并按照下一节中的说明进行操作

您可以直接前往完成的例子如果你光盘进入使用hal和json视图的grails指南已完成

运行应用程序

365bet地区对RESTful网址映射提供了出色的支持,以公开域资源。初始我们已经用的项目注释了我们的域类资源资源注释生成一个RestfulController和相关的URL映射,以将每个域类公开为静态资源

grails应用程序域com示例客户常规
举个例子进口 休息

资源资源只读真正小号'api客户') (1)
 顾客 {
1 资源资源批注带有几个可选参数,包括URL端点和格式选项,以及API是否仅应公开读取的端点

将这些注释添加到我们的域类中后,我们便可以开始创建API了。请参阅365bet地区文档有关更多信息资源资源

要运行该应用程序,请使用gradlew bootRun命令将在端口上启动应用程序

现在,365bet地区应用程序正在运行,我们可以尝试通过365bet地区为我们生成的API。资源资源向GET请求api产品检索产品列表

curl H接受应用程序json localhost api产品
[
  {
    "ID": 1,
    "类别": {
      "ID": 1
    },
    "库存编号": "",
    "那么": "工装裤",
    "价钱": 15.00
  },
  {
    "ID": 2,
    "类别": {
      "ID": 1
    },
    "库存编号": "",
    "那么": "毛衣",
    "价钱": 12.00
  },
  {
    "ID": 3,
    "类别": {
      "ID": 1
//...
]

这是一个GET请求api订单返回订购ID为

curl H接受应用程序json localhost api命令
{
   "ID" : 1,
   "送货地址" : {
      "ID" : 1
   },
   "运输费" : 13.54,
   "orderId" : "一种",
   "orderPlaced" : "Z",
   "产品展示" : [
      {
         "ID" : 11
      },
      {
         "ID" : 6
      },
      {
         "ID" : 1
      }
   ],
   "顾客" : {
      "ID" : 1
   }
}
因为我们已经指定readOnly是在我们的资源资源注释365bet地区将不会为更新创建,删除操作生成端点。这足以完成本指南中的步骤,但是您可以删除只读属性或将其设置为启用写操作

建立我们的API

365bet地区呈现的默认JSON是一个很好的开始,但不一定表示我们在面向公众的API中所需的详细信息JSON视图允许我们使用Groovy渲染数据流JsonBuilder在静态编译的Groovy视图中,JSON视图提供了一个基于DSL的强大工具,用于表达API的JSON输出

JSON视图介绍

这是一个简单的JSON视图示例

json消息你好"世界"
}

呈现时,此JSON视图将产生以下输出

{"信息":{ "你好":"世界"}}

JSON视图还支持模型它引用了传递到视图的数据,如下所示

模型消息json消息你好消息

JSON视图是具有文件扩展名的Groovy文件格森他们住在grails应用程序视图像GSP视图一样的目录通过约定将它们解析为与视图目录相同名称的控制器,例如GSP视图

自定义我们的API

让我们创建一个JSON视图以自定义来自的输出api订单ID端点现在,默认的JSON渲染器包括所有关联对象的ID。但是,我们不想公开ID送货地址属性是我们的一个实例地址域类,它不会在我们的API中公开为域资源,并且仅与API用户相关,而该类是订购要么顾客理想情况下,我们希望将送货地址我们的JSON输出中的字段订购API

另外,我们想表达orderId属性作为订单ID而不是数据库中的实际ID

在下面创建一个新目录grails应用程序视图订购:

mkdir grails应用程序查看顺序
如果您熟悉365bet地区的视图分辨率,您可能会认为我们需要创建一个OrderController为了使用我们的观点订购目录我们可以这样做,因为我们正在使用资源资源域类365bet地区上的注释将生成一个关联的OrderController继而继承自RestfulController对于我们来说,此时我们不需要为我们的控制器创建控制器订购

创建一个名为的新JSON视图显示gson这将解决节目在我们的控制器中就像显示gsp页面将在正常的365bet地区应用程序中使用以下内容编辑新视图

grails应用程序视图顺序显示gson
进口 带有示例订单型号订单订单json id订单订单ID shippingCost订单shippingCost日期订单orderPlaced格式'M dd yyyy') (1)送货地址(2)街道订单送货地址街道街道订单送货地址街道城市订单送货地址城市州订单送货地址州邮编订单送货地址邮政编码产品订单产品收货ID: ID(3)客户编号订单客户编号
1 请注意,我们正在使用Groovy格式上的方法日期类以自定义格式orderPlaced属性
2 在这里,我们重新填写我们的送货地址与来自地址
3 请注意,我们在收集上进行了迭代订购产品收藏方法并返回地图,这将创建一个JSON对象数组

现在,如果您请求api订单您应该看到以下输出

curl H接受应用程序json localhost api命令
{
    ID: "一种",
    运输费: 13.54,
    日期: "2-08-2017",
    送货地址: {
        : "箭侠",
        : 空值,
        : "芝加哥",
        : "IL",
        压缩: 646465
    },
    产品展示: [
            {
                ID: 11
            },
            {
                ID: 1
            },
            {
                ID: 6
            }
    ],
    顾客: {
        ID: 1
    }
}

我们为我们创建另一个JSON视图顾客域类在下面创建一个新目录grails应用程序视图顾客和一个新的JSON视图显示gson

mkdir grails应用程序查看客户

创建一个名为的新JSON视图显示gson这将解决节目在我们的控制器中就像显示gsp页面将在正常的365bet地区应用程序中使用以下内容编辑新视图

grails应用查看客户显示gson
进口 与示例客户模型客户客户json ID客户ID firstName客户firstName lastName客户lastName fullName"${客户名字} ${客户姓氏}"地址街道客户地址街道街道客户地址街道城市客户地址城市州客户地址州邮编客户地址邮编订单客户订单收集ID: ID

通过HAL使我们的API可发现

我们现在已经对API进行了一些自定义,但存在一些问题

  1. 通过定制我们的ID订单的属性,客户不再知道如何参考微粒记录因为我们的API仍然依赖于数据库ID

  2. 我们的三个公开领域类具有许多仅公开ID的关联这意味着客户需要提出新的请求以获取相关对象的详细信息,例如,使用订单的客户需要提出单独的请求以获取其产品的字段

  3. 没有文档的用户,我们的API相当不透明,即使使用文档,用户也必须猜测端点才能到达关联的记录,即使有文档,客户也可能需要使用自定义代码来浏览我们的API没有一致的标准跟随

HAL JSON标准的约定可以帮助我们解决这些问题,JSON视图为HAL提供了一流的支持,让我们看看如何使用它

链接是HAL标准中的关键HAL资源包括一个特殊字段,称为链接其中包含一组JSON对象,这些JSON对象定义了到相关资源的链接HAL链接至少包含两段信息:关系和href包含访问相关资源的URL

这是JSON主体的示例,其中包含链接字段和两个链接

{
    标题: "Groovy食谱",
    作者: "斯科特·戴维斯",
    页数: 100,

    "链接": {
        "": {
            "href": "http localhost书展",    (1)
        },
        "作者": {
            "href": "http localhost作者显示", (2)
        }
    }
}
1 是每个HAL资源都应包括的特殊链接,它指定返回当前资源的URL
2 在这里,我们重新定义了一个自定义链接作者指定网址的作者领域

当客户端访问HAL资源时,可以浏览以链接字段,而客户端不知道API端点的确切组成

示例使用提取API https开发人员mozilla org zh美国文档Web API提取API

从API检索书籍实例"http本地主机api书"然后功能响应返回响应json然后功能数据这个图书数据使用链接检索图书作者var author fetch book links author href then function response返回响应json然后是函数数据作者数据

JSON视图实现Groovy特性HalView暴露出案件输出几种与HAL兼容的JSON的方法的助手,其中之一是链接方法

型号订单订单json hal链接订单//...
}

呼唤是Linux吗在我们的域资源上会产生以下JSON输出

{
    链接: {
        : {
            href: "http localhost api命令",
            反射性: "在美国",
            类型: "应用程序hal json"
        }
    }
}

让我们编辑我们的订购节目gson查看包含链接以及与相关客户的链接

grails应用程序视图顺序显示gson
进口 带有示例订单模型Order order json hal链接订购顾客订购客户(1)id订单orderId shipping成本订单shippingCost日期订单orderPlaced格式'M dd yyyy'shippingAddress街道订单shippingAddress街道街道订单shippingAddress街道城市订单ShippingAddress城市州订单ShippingAddress州zip订单shippingAddress zip产品订单产品collectID: id客户id订单客户id
1 链接方法可以采用域资源实例或链接名称和对象的映射进行链接
{
    链接: {
        : {
            href: "HTTP本地主机${服务器端口}api订单ID",
            反射性: "",
            类型: "应用程序hal json"
        },
        顾客: {
            href: "HTTP本地主机${服务器端口}api客户编号",
            反射性: "",
            类型: "应用程序hal json"
        }
    },
    ID: "一种",
    运输费: 13.54,
    日期: "2-08-2017",
    送货地址: {
        : "箭侠",
        : 空值,
        : "芝加哥",
        : "IL",
        压缩: 646465
    },
    产品展示: [
            {
                ID: 11
            },
            {
                ID: 1
            },
            {
                ID: 6
            }
    ],
    顾客: {
        ID: 1
    }
}
    //...
}

使用模板渲染集合

订购与...有很多关系产品现在,我们的API返回一个简单的ID列表,以顺序表示产品。理想情况下,我们也希望包含这些产品的链接,以便我们API的客户可以通过遵循我们提供的链接来检索每个产品的详细信息。使用JSON视图模板功能

在里面365bet地区应用查看顺序目录创建一个新的JSON模板,名称为产品gson:

grails应用程序视图订购产品gson
进口 com示例产品型号产品产品json hal链接产品ID产品ID

现在在我们的订购节目gson查看我们可以通过订购产品汤普使用我们的新助手产品模板

grails应用程序视图顺序显示v gson
进口 带有示例订单模型Order order json hal链接订购顾客订单客户ID订单orderId出货成本订单出货成本日期订单orderPlaced格式'M dd yyyy'shippingAddress街道订单运输地址Street街道订单运输地址Address街道城市订单运输地址城市状态订单运输地址状态zip订单运输地址zip产品tmpl产品订购产品(1)
}
1 汤普帮助程序将方法名称解析为当前视图目录中的模板。tmpl产品将解决订购产品gson如果要从当前目录之外访问模板,则可以使用相对于模板的绝对路径意见目录作为字符串Tmpl客户订单将解决grails应用查看客户订单gson.
有关在JSON视图中使用模板的更多信息,请参见365bet地区 Views文档.

提出要求http localhost api命令你应该看到链接对于中的每个产品产品展示数组

{
    链接: {
        : {
            href: "HTTP本地主机${服务器端口}api订单ID",
            反射性: "",
            类型: "应用程序hal json"
        },
        顾客: {
            href: "HTTP本地主机${服务器端口}api客户编号",
            反射性: "",
            类型: "应用程序hal json"
        }
    },
    ID: "一种",
    运输费: 13.54,
    日期: "2-08-2017",
    送货地址: {
        : "箭侠",
        : 空值,
        : "芝加哥",
        : "IL",
        压缩: 646465
    },
    产品展示: [
        {
            链接: {
                : {
                    href: "HTTP本地主机${服务器端口}api产品",
                    反射性: "",
                    类型: "应用程序hal json"
                }
            },
            ID: 11
        },
        {
            链接: {
                : {
                    href: "HTTP本地主机${服务器端口}api产品",
                    反射性: "",
                    类型: "应用程序hal json"
                }
            },
            ID: 6
        },
        {
            链接: {
                : {
                    href: "HTTP本地主机${服务器端口}api产品",
                    反射性: "",
                    类型: "应用程序hal json"
                }
            },
            ID: 1
        }
    ]
}

让我们对客户订单在grails应用中创建新模板查看客户订单gson:

grails应用查看客户订单gson
进口 带有示例订单型号订单订单json hal链接订单ID订单ID

编辑客户展示gson查看使用新的订购模板

让我们对客户订单在grails应用中创建新模板查看客户订单gson:

grails应用查看客户显示gson
进口 与示例客户模型客户客户json ID客户ID firstName客户firstName lastName客户lastName fullName"${客户名字} ${客户姓氏}"地址街道客户地址街道街道客户地址街道城市客户地址城市州客户地址州邮政编码客户地址邮政编码订单tmpl订单客户订单

嵌入关联对象

让我们来看看我们的产品域资源产品有一个属于有关系类别在我们的默认JSON输出中以类别ID的简单对象表示

{
    ID: 1,
    类别: {
        ID: 1
    },
    库存编号: "",
    那么: "工装裤",
    价钱: 15
}

同样,我们希望使API的使用者更容易获得产品的类别。我们有几种选择

  1. 我们可以简单地包括类别JSON视图中的详细信息这种方法掩盖了产品类别我们API中的资源会给客户以错误的印象分类名称是的财产产品而不是本身拥有API资源

  2. 我们可以提供链接到类别这种方法将要求客户提出新的请求以获取类别详细信息,并且大多数客户可能希望在同一请求中同时获得产品和类别详细信息

您可能还记得在订购s的情况下送货地址我们在JSON视图中使用了这两种方法中的第一种,包括相关对象的详细信息,这是因为地址没有在我们的API中作为资源公开,因此地址实际上是订购 (送货地址或一个顾客 (地址就我们的API而言

HAL指定一个嵌入式的属性以嵌套格式表示跨资源关系使用嵌入式方法,我们可以将类别在相同的HAL JSON响应中,但是类别将位于单独的元素中,以明确表明这些是单独的资源

JSON视图提供了一个嵌入式的通过的方法案件会产生一个嵌入式的JSON视图中的元素。它将包含嵌入对象的默认JSON输出以及每个对象的链接让我们使用它将类别嵌入到我们的产品输出中

在下面创建一个新目录grails应用程序视图产品:

mkdir grails应用程序查看产品

在此目录下创建一个新的JSON视图,名为显示gson:

grails应用程序浏览量产品显示gson
进口 com示例产品型号产品产品json hal链接产品hal嵌入式类别产品分类(1)id产品库存ID名称产品名称价格产品价格
1 我们正在过去嵌入式的在这种情况下,方法元素名称的映射类别嵌入对象产品分类)
{
  "链接": {
    "": {
      "href": "HTTP本地主机${服务器端口}api产品",
      "反射性": "",
      "类型": "应用程序hal json"
    }
  },
  "嵌入式的": {
    "类别": {
      "链接": {
        "": {
          "href": "HTTP本地主机${服务器端口}api类别",
          "反射性": "",
          "类型": "应用程序hal json"
        }
      },
      "那么": "服装",
      "": 0
    }
  },
  "ID": "",
  "那么": "工装裤",
  "价钱": 15.00
}

在之前的代码段中类别对象包含我们的默认JSON渲染器输出类别资源以及链接,以便客户可以根据需要直接请求类别

让我们使用嵌入式方法的顺序显示gson查看并嵌入订购客户资源

grails应用程序视图顺序显示gson
进口 带有示例订单模型Order order json hal链接订购顾客订购客户半嵌入式顾客订购客户(1)
    }
  },
  "嵌入式的": {
    "顾客": {
      "链接": {
        "": {
          "href": "HTTP本地主机${服务器端口}api客户",
          "反射性": "",
          "类型": "应用程序hal json"
        }
      },
      "名字": "彼得",
      "": "",
      "": 0

现在,我们API的客户可以访问嵌入式资源的详细信息,而无需发出其他请求

示例使用提取API https开发人员mozilla org zh美国文档Web API提取API

从API检索订单实例"http localhost api命令"然后功能响应返回响应json然后功能数据这个订单数据var客户这个订购嵌入式客户控制台日志"订单编号" + 这个订单ID控制台日志"顾客"客户名字" "客户姓氏从API检索产品实例"http localhost api产品"然后功能响应返回响应json然后功能数据这个产品数据控制台日志"产品" + 这个产品名称控制台日志"类别" + 这个订单嵌入的类别名称

分页结果

HAL标准规定的另一种约定是分页。在提供资源列表时,链接元素可以提供第一, 上一个, 下一个持续可用于浏览资源列表的链接

案件助手提供了一个分页将生成这些链接并处理资源分页的方法此方法需要在模型JSON视图的名称,以便跟踪当前偏移量每页的最大记录数和资源总数。为此,我们需要创建一个控制器,以便我们可以传入所需的模型参数

让我们在我们的HAL分页链接上使用产品资源

因为我们将创造自己的产品控制器为了提供分页所需的参数,我们将需要删除资源资源我们一直在我们上使用的注释产品域类编辑grails应用程序域com示例产品groovy:

grails应用程序域com示例产品groovy
举个例子 产品 {

    那么库存编号大十进制价钱静态的属于类别类别
在开发RESTful API时,您经常会发现生成的控制器和URL映射来自资源资源是入门的好方法,但在某些时候,您将需要对生成该API的API进行更多控制RestfulController在这一点上,你自己是一个很好的解决方案

现在创建一个新的RestfulController使用创建宁静的控制器由命令提供休息api轮廓

grailsw创建restful controller com示例ProductController

使用以下内容编辑此新控制器

365bet地区应用程序控制器com示例ProductController groovy
举个例子进口 365bet地区 Rest RestfulController

 产品控制器 延伸RestfulController {
    静态的responseFormats'json'产品控制器产品覆写
    定义 指数(整数最大参数最大数学最小最大10, 100)

        返回productList listAllResources参数(1)
                productCountcountResources(2)最大参数最大(3)偏移量参数int"抵销") ?: 0, (4)排序参数排序(5)订单参数订单(6)
        ]
    }

    覆写
    布尔值getReadOnly返回 真正
    }
}
1 listAllResource是由RestfulController返回所有域资源的列表,您可以覆盖此方法以控制如何生成此列表
2 countResources是另一个RestfulController再次使用方法,您可以覆盖实现以适合您的API
3 每页结果总数
4 用于计算当前页面的偏移量
5 属性排序
6 分类方向

最后,我们需要编辑我们的网址映射创建以前使用生成的其余端点资源资源注解365bet地区支持资源URL映射上的属性,该属性将自动生成这些URLUrlMappings常规并将以下规则添加到映射

grails应用程序控制器com示例UrlMappings groovy
"api产品"(资源: "产品")

现在,我们可以使用分页创建新的JSON视图在下面创建以下视图和模板365bet地区应用程式浏览量产品:

grails应用查看产品索引gson
进口 com示例产品模型可迭代的产品列表(1)
    整数productCount(2)
    整数最大值整数抵销分类order json hal paginate产品productCount偏移量最大排序顺序(3)产品tmpl产品productList[]计算产品计数最大最大偏移量偏移量排序排序顺序
1 产品资源清单
2 来自控制器的分页参数
3 在这里,我们将分页参数传递给分页生成HAL分页链接的方法
grails应用程序浏览量产品产品gson
进口 com示例产品型号产品产品json hal链接产品名称产品名称id产品库存编号价格产品价格类别产品类别名称
"""链接self href http localhost${服务器端口}api产品offset max hreflang en type application hal json first href http localhost${服务器端口}api产品偏移max hreflang zh_cn下一href http本地主机${服务器端口}api产品偏移max hreflang en last href http localhost${服务器端口}api产品偏移量max hreflang zh-CN产品链接self href http localhost${服务器端口}api产品hreflang键入应用程序hal json名称工装裤ID CLOTH价格类别服装链接self href http localhost${服务器端口}api产品hreflang键入应用程序hal json名称毛衣ID服装价格类别服装链接self href http localhost${服务器端口}api产品hreflang键入应用程序hal json名称牛仔裤ID服装价格类别服装链接self href http localhost${服务器端口}api产品hreflang键入应用程序hal json名称女衬衫id衣服价格类别服装链接self href http localhost${服务器端口}api产品hreflang键入应用程序hal json名称T衬衫ID CLOTH价格类别服装链接self href http localhost${服务器端口}api产品hreflang键入应用程序hal json名称夹克ID服装价格类别服装链接自我href http本地主机${服务器端口}api产品hreflang键入应用程序hal json名称书架ID FURN价格类别家具链接self href http localhost${服务器端口}api产品hreflang键入应用程序hal json名称咖啡桌ID FURN价格类别家具链接self href http localhost${服务器端口}api产品hreflang键入应用程序hal json名称虚荣ID FURN价格类别家具链接self href http localhost${服务器端口}api产品hreflang键入应用程序hal json名称表Saw id工具价格类别工具数量最大偏移量排序null订单null

下一个链接http本地主机产品索引偏移量最大值您会看到结果的下一页由于我们的示例数据中的资源较少,因此只有页面会尝试更改最大值您请求中的参数现在将检索其他页面以反映较小的页面大小

如果您愿意,请重复这些步骤以对其他域资源启用分页,例如订购顾客.

自定义MIME类型

HAL资源可以声明客户端应使用的自定义MIME类型或内容类型,以便与API进行交互365bet地区在默认情况下包括两种通用的HAL MIME类型yml应用程序:

grails应用配置会议应用yml
    接受:
        标头:
            userAgent:
                - 壁虎
                - WebKit
                - 急板
                - 三叉戟
类型:
    json:
      - 应用程序json
      - 文字json
    案件:
      - 应用程序hal json
      - 应用程序hal xml
    XML文件:
      - 文字xml
      - 应用程序XML

您可以根据需要为该API指定自定义MIME类型,方法是在此配置中添加一个条目

grails应用配置会议应用yml
        XML文件:
          - 文字xml
          - 应用程序XML
        原子: 应用程序原子xml
        的CSS: 文字CSS
        CSV: 文字csv
        js: 文字javascript
        rss: 应用程序rss xml
        文本: 纯文字
        所有: '*/*'
        库存: "应用程序vnd com示例清单json" (1)
网址映射:
    :
        最大尺寸: 1000
1 指定一个称为的MIME类型库存并通过约定为它指定类型越南盾指示供应商MIME类型

现在,您可以使用JSON视图在此自定义MIME类型中使用类型辅助方法

grails应用程序浏览量产品显示gson
进口 com示例产品型号产品产品json hal链接产品hal嵌入式类别产品类别hal类型"库存") (1)id产品库存ID名称产品名称价格产品价格
1 哈尔型方法采用一个字符串来标识中的自定义MIME类型yml应用程序文件或显式MIME规范作为字符串

提出要求http localhost api产品查看自定义内容类型

curl i本地产品HTTP X应用程序上下文应用程序开发内容类型应用程序vnd com示例清单json字符集UTF(1)传输编码块日期日期2月GMT def结果渲染查看产品显示模型产品产品然后结果json嵌入
1 请注意新的MIME类型内容类型标头

探索API

HAL JSON是用于结构化API输出的灵活而强大的规范,它允许API的客户端(无论是第三方集成还是您自己的Web应用程序或本机应用程序)以有效且一致的方式导航您的资源

有许多有用的工具可用于开发和测试HAL JSON API。如果您使用的是Google Chrome浏览器,请尝试安装JSONView插件并将您的浏览器导航到http localhost api产品该插件将以一种令人愉悦的格式呈现JSON,并允许您在浏览器中跟踪资源之间的链接

JSONViewer
图Google Chrome的JSONViewer插件

另一个强大的测试工具和您的API是邮差适用于macOS Windows Linux和Chrome OS的基于Google Chrome的应用程序

邮差
人物邮递员

您需要365bet地区帮助吗

OCI赞助了本指南的创建OCI提供了几种365bet地区服务:

免费咨询

OCI 365bet地区团队包括365bet地区联合创始人Jeff Scott Brown和Graeme Rocher检查我们的365bet地区课程并向发展和维护365bet地区的工程师学习

Grails OCI团队