(快速参考)

4.0.2

休息

365bet地区

域类作为REST资源

365bet地区在365bet地区中创建RESTful API的最简单方法是将域类公开为REST资源。这可以通过添加grails rest资源转换为任何领域类

 休息

小号'图书')
  {

    标题静态的约束标题空白:
    }
}

只需添加资源资源转换并指定URI,您的域类将自动以REST资源的形式提供XML或JSON格式。转换将自动注册必要的RESTful URL映射并创建一个名为BookController.

您可以通过向其中添加一些测试数据来进行尝试BootStrap常规:

定义初始化ServletContext (标题:"展台"保存 (标题:"闪耀"保存

然后点击URLhttp本地主机书籍这将使响应像


<> ID="1">
    span展台span类标签

如果将URL更改为http localhost图书json您将收到JSON响应,例如

{"ID":1,"标题":"展台"}

如果您希望更改默认值以返回JSON而不是XML,可以通过设置格式的属性资源资源转型

 休息

小号'图书'格式'json', ''])
  {
    ...
}

在上面的示例中,将对JSON进行优先级排序。传递的列表应包含资源应公开的格式的名称。格式的名称在grails mime类型的设置应用程序:

grails mime类型json'应用程序json', '文字json'XML文件'文字xml', '应用程序XML']
]

请参阅以下部分配置Mime类型在用户指南中了解更多信息

除了使用URI中的文件扩展名之外,您还可以使用ACCEPT标头获取JSON响应。这是使用Unix的示例卷曲工具

curl i H接受应用程序json localhost书籍ID标题The Stand

365bet地区这要归功于365bet地区内容协商特征

您可以通过发出开机自检请求

curl i X POST H内容类型应用程序json d标题伴随蜘蛛A本地主机书籍HTTP创建的服务器Apache Coyote

可以使用请求

curl i X PUT H内容类型应用程序json d标题伴随蜘蛛A本地主机书籍HTTP OK服务器Apache Coyote

最后,可以删除资源删除请求

curl i X删除本地主机书籍HTTP No Content Server Apache Coyote

如您所见资源资源转换启用资源上的所有HTTP方法动词。通过设置只读属性为true

 休息

小号'图书'只读)
  {
    ...
}

在这种情况下开机自检, 删除要求将被禁止

映射到REST资源

如果您希望将URL映射的声明保留在您的UrlMappings常规文件,然后只需删除小号的属性资源资源转换并将以下行添加到UrlMappings常规就足够了

"图书"(资源:"")

扩展您的API以包含更多端点然后变得微不足道

"图书"(资源:"") {
    "发布者"(控制者:"发布者", 方法:"得到")
}

上面的示例将公开URI图书出版商.

有关的更详细说明创建RESTful URL映射可以在URL映射部分用户指南

从GSP页面链接到REST资源

链接标签提供了一种链接到任何域类资源的简便方法

<> 资源="">我的链接

但是,当前您不能使用g链接来链接到DELETE操作,并且大多数浏览器不支持直接发送DELETE方法

最好的方法是使用表单提交

<> 行动="" 方法="发布">
         <> 类型="" ="方法" ="删除"/>
形成

365bet地区365bet地区支持通过隐藏重写请求方法方法参数这是出于浏览器兼容性的目的。在使用静态资源映射创建强大的Web界面时,此功能很有用。要使链接触发,此类事件可能会捕获具有数据方法属性并通过JavaScript发布表单提交

REST资源版本控制

365bet地区REST API的常见要求是同时公开不同的版本。365bet地区中可以通过几种方法来实现。

使用URI进行版本控制

通用的方法是使用URI来版本化API,尽管不建议使用此方法来支持Hypermedia。例如,您可以定义以下URL映射

"装箱"(资源:"", 命名空间:'')
"装箱"(资源:"", 命名空间:'')

这将与以下控制器匹配

轻按 BookController {
    静态的命名空间''
}

轻按 BookController {
    静态的命名空间''
}

这种方法的缺点是您的API需要两个不同的URI名称空间

使用“接受版本”标头进行版本控制

365bet地区作为替代方案,365bet地区支持通过接受版本来自客户端的标头例如,您可以定义以下URL映射

"图书"(:'1.0', 资源:"", 命名空间:'')
"图书"(:'2.0', 资源:"", 命名空间:'')

然后在客户端中,只需使用接受版本标头

curl i H接受版本X GET http localhost书籍

使用Hypermedia Mime类型进行版本控制

版本控制的另一种方法是使用Mime Type定义来声明您的自定义媒体类型的版本,有关超媒体概念的更多信息,请参见“将超媒体作为应用程序状态的引擎”一节。应用程序您可以为您的资源声明自定义的Mime类型,其中包括版本参数v参数

grails mime类型所有: '*/*',
    : "应用程序vnd图书org图书json v",
    bookv: "应用程序vnd图书org图书json v",
    ...
}
365bet地区将新的mime类型放在所有Mime类型之后是至关重要的,因为如果无法建立请求的内容类型,则映射中的第一个条目将用于响应。如果您的新Mime类型位于顶部,则365bet地区将如果无法建立要求的Mime类型,请务必尝试回传您的新Mime类型

然后覆盖渲染器,请参阅“自定义响应渲染”部分,以获取有关自定义渲染器的更多信息,以将自定义Mime类型发送回。grails app conf spring资源库:

 grails rest渲染json
 grails网站mime豆bookRendererV JsonRenderer myapp v BookMimeType"应用程序vnd图书org图书json", [:"1.0"bookRendererV JsonRenderer myapp v书MimeType"应用程序vnd图书org图书json", [:"2.0"]))
}

然后更新控制器中可接受的响应格式列表

 BookController 延伸RestfulController静态的responseFormats'json', '', '', 'bookv']

    // ...
}

然后使用接受标头,您可以使用Mime Type指定所需的版本

$卷曲我"接受应用程序vnd图书org图书json v"X GEThttp:本地书

实施REST控制器

资源资源转换是入门的快速方法,但通常您将需要自定义控制器逻辑以呈现响应或扩展API以包括其他操作

扩展RestfulController超类

开始这样做的最简单方法是为您的资源创建一个新的控制器,以扩展365bet地区 Rest RestfulController超类例如

 BookController 延伸RestfulController> {
    静态的responseFormats'json', ''BookController()
    }
}

要自定义任何逻辑,您只需覆盖适当的操作即可。下表提供了操作名称的名称以及它们映射到的URI。

HTTP方法 URI 控制器动作

得到

图书

指数

得到

书籍创作

创建

开机自检

图书

得到

书籍编号

得到

图书编号

编辑

书籍编号

更新

删除

书籍编号

创建编辑仅当控制器公开HTML界面时才需要执行操作

例如,如果您有一个嵌套资源那么您通常希望同时查询父标识符和子标识符。例如,给定以下URL映射

"作家"(资源:'作者') {
    "图书"(资源:'')
}

您可以按以下方式实现嵌套控制器

 BookController 延伸RestfulController静态的responseFormats'json', ''BookController()
    }

    覆写
     queryForResource可序列化IDid id作者ID参数authorId在哪里找到

上面子类的示例RestfulController并覆盖受保护的queryForResource自定义资源查询以考虑父资源的方法

在RestfulController子类中自定义数据绑定

RestfulController类包含对诸如以下操作进行数据绑定的代码更新该类定义了一个getObjectToBind返回一个值的方法,该值将用作数据绑定的源。例如,更新操作执行以下操作

 RestfulController {

    定义 更新T实例从数据库检索实例实例属性getObjectToBind// ...
    }

    // ...
}

默认情况下getObjectToBind方法返回对象何时如果请求具有主体,则将该对象用作绑定源,然后将对该主体进行解析,并将其内容用于进行数据绑定,否则将使用请求参数进行数据绑定。RestfulController的子类可能会覆盖getObjectToBind方法并返回任何有效绑定源,包括地图或一个DataBindingSource在大多数情况下,绑定请求是适当的,但是getObjectToBind方法允许在需要的地方更改该行为

使用带有资源注释的RestfulController的自定义子类

您还可以自定义支持Resource批注的控制器的行为

该类必须提供一个以域类为参数的构造函数。第二个构造函数是支持带readOnly true的Resource注释所必需的。

这是一个模板,可用于资源注释中使用的子类RestfulController类

 SubclassRestfulController 延伸RestfulControllerSubclassRestfulControllerdomainClass这个domainClassSubclassRestfulControllerdomainClass布尔值只读domainClass readOnly

您可以使用来指定支持资源注释的控制器的超类。超类属性

 休息

小号'图书'超类SubclassRestfulController  {

    标题静态的约束标题空白:
    }
}

逐步实施REST控制器

如果您不想利用RestfulController父类,那么您可以自己手动实现每个HTTP动词第一步是创建一个控制器

$grails创建控制器书

然后添加一些有用的导入并默认启用readOnly

 grails gorm交易
 静态的 org springframework http HttpStatus
 静态的 org springframework http HttpMethod

交易性只读)
 BookController {
    ...
}

365bet地区回忆每个HTTP动词根据以下约定与特定的365bet地区动作匹配

HTTP方法 URI 控制器动作

得到

图书

指数

得到

书籍编号

得到

书籍创作

创建

得到

图书编号

编辑

开机自检

图书

书籍编号

更新

删除

书籍编号

创建编辑如果您计划为REST资源实现HTML接口,则已经需要执行操作。这些操作是为了呈现适当的HTML表单以创建和编辑资源而已,如果不需要,可以将其丢弃

实施REST操作的关键是响应365bet地区365bet地区中介绍的方法响应方法尝试为请求的内容类型JSON XML HTML等生成最适当的响应

实施索引动作

例如实施指数动作简单地称为响应传递要响应的对象列表的方法

定义 指数(整数最大参数最大数学最小最大10, 100响应列出参数模型:[bookCount: 计数

请注意,在上面的示例中,我们还使用了模型的论点响应提供总数的方法仅当您计划通过某些用户界面支持分页时才需要

响应方法将使用内容协商给定客户端通过ACCEPT标头或文件扩展名请求的内容类型,尝试以最适当的响应进行回复

如果将内容类型确定为HTML,则将产生一个模型,使得上述动作等同于编写

定义 指数(整数最大参数最大数学最小最大10, 100)
    [bookList: 列出参数bookCount: 计数

通过提供索引gsp文件,您可以为给定模型呈现适当的视图。如果内容类型不是HTML,则响应方法将尝试查找适当的365bet地区休息渲染器能够呈现传递的对象的实例这是通过检查grails rest渲染RendererRegistry.

默认情况下,已经为JSON和XML配置了渲染器,以查找如何注册自定义渲染器,请参阅“自定义响应渲染”部分

实施表演动作

可以用一行Groovy代码(不包括方法签名)来实现按id显示和按ID单独显示资源的操作

定义 (本书回应书

365bet地区通过将域实例指定为操作的参数,365bet地区将自动尝试使用ID请求的参数如果域实例不存在,则空值将传递给动作响应如果传递null,则方法将返回错误,否则将再次尝试呈现适当的响应。如果格式为HTML,则将生成适当的模型。以下动作在功能上等同于上述动作

定义 (如果空值渲染状态:404
    }
    其他 {
        返回 [

实施保存动作

操作创建新的资源表示形式首先,只需定义一个接受资源作为第一个参数的操作并将其标记为交易性grails gorm Transactions事务性转变

交易性
定义 (

然后要做的第一件事是检查资源是否有任何验证错误如果是这样,则以错误回应

如果书籍hasErrors回应书籍错误视图:'创建'
}
其他 {
    ...
}

对于HTML,将再次呈现create视图,以便用户纠正无效的输入。对于其他格式,如JSON XML等,错误对象本身将以适当的格式呈现,并返回状态代码为UNPROCESSABLE ENTITY

如果没有错误,则可以保存资源并发送适当的响应

图书保存齐平:withFormat html Flash消息消息: '默认创建的消息', args信息: '书标签', 默认: ''书号重定向书'*'渲染状态已建立

如果是HTML,则将重定向发送到原始资源,而对于其他格式,则返回状态码CREATED

实施更新操作

更新操作会更新现有的资源表示形式,并且与操作首先定义方法签名

交易性
定义 更新(

365bet地区如果资源存在,则365bet地区将加载资源,否则传递null。如果为null,则应返回a

如果空值渲染状态未找到其他 {
        ...
    }

然后再次检查错误验证错误如果是这样,则以错误回应

如果书籍hasErrors回应书籍错误视图:'编辑'
}
其他 {
    ...
}

对于HTML,将再次呈现编辑视图,以便用户可以更正无效的输入。对于其他格式的JSON XML等,错误对象本身将以适当的格式呈现,并返回状态代码为UNPROCESSABLE ENTITY

如果没有错误,则可以保存资源并发送适当的响应

图书保存齐平:withFormat html Flash消息消息: '默认更新消息', args信息: '书标签', 默认: ''书号重定向书'*'渲染状态

如果是HTML,则将重定向发送到原始资源,而对于其他格式,则返回OK状态码

实施删除动作

操作会删除现有资源,其实现方式与更新除了删除方法被调用

图书删除齐平:withFormat html Flash消息消息: '默认删除的邮件', args信息: '书本标签', 默认: ''图书ID重定向行动:"指数", 方法:"得到"
    }
    '*'渲染状态无内容

请注意,对于HTML响应,会将重定向发送回指数动作,而对于其他内容类型,返回响应代码“ NO CONTENT”

使用脚手架生成REST控制器

要了解其中的一些概念,并帮助您继续脚手架插件版本和更高版本可以为您生成REST ready控制器,只需运行以下命令

grails生成控制器>

使用HttpClient调用REST服务

365bet地区调用365bet地区 REST服务以及第三方服务非常简单,只需使用Micronaut HTTP客户端该HTTP客户端同时具有低级API和高级AOP驱动的API,从而使其既可用于简单请求,也可用于构建声明性类型安全的API层

要使用Micronaut HTTP客户端,您必须具有micronaut http客户端对您的类路径的依赖项将以下依赖项添加到您的建立gradle文件

建立gradle
编译'io micronaut micronaut http客户端'

低级API

HttpClient接口构成了低级API的基础。此接口声明了一些方法,以帮助简化执行HTTP请求和接收响应的过程

大部分方法HttpClient接口返回Reactive Streams Publisher实例,并包含一个称为RxHttpClient的子接口,该子接口提供HttpClient接口的变体,该接口返回RxJava Flowable类型。HttpClient在阻塞流中,您可能希望致电封锁返回一个实例BlockingHttpClient.

您可以通过几种方式获取对HttpClient最简单的方法是使用创建方法

创建一个HTTP客户端
    清单searchWithApi搜索词的baseUrl"https itunes苹果com"HttpClient客户端HttpClient创建baseUrl toURL toBlocking(1)HttpRequest请求HttpRequest GET"搜索限制媒体音乐实体专辑词${搜索词}"HttpResponse响应客户交换请求客户关闭(2)

        json resp正文ObjectMapper objectMapper对象映射器(3)objectMapper配置反序列化功能未知属性失败)
        搜索结果searchResult objectMapper readValue json搜索结果searchResult结果
1 创建一个新的实例HttpClient创建方法并将其转换为BlockingHttpClient封锁,
2 客户应使用防止线程泄漏的方法
3 Xaxson p对象映射器在这种情况下,可以使用API​​将原始JSON映射到POGO搜索结果

咨询Http客户端部分Micronaut用户指南有关使用HttpClient低级API

声明性API

可以通过添加以下内容来编写声明性HTTP客户端:客户对任何接口或抽象类的注释使用Micronaut的AOP支持,请参见《 Micronaut用户指南》简介建议HTTP调用时,抽象或接口方法将在编译时为您实现。声明性客户端可以返回数据绑定的POGO或POJO,而无需调用代码进行特殊处理

例子 io micronaut http注解
 io micronaut http客户端注释客户端

客户("https start grails org")
接口365bet地区365bet地区AppForgeClient得到("版本配置文件")
    清单<地图型材

请注意,HTTP客户端方法使用适当的HTTP方法进行注释,例如得到要么发布.

要使用上述示例中的客户端,只需使用以下命令将客户端的实例注入到任何bean中:自动接线注解

  自动接线365bet地区365bet地区AppForgeClient appForgeClient清单<地图型材grailsVersion响应appForgeClient配置文件grailsVersion

有关编写和使用声明性客户端的更多详细信息,请参阅Http客户端部分Micronaut用户指南.

REST配置文件

365bet地区由于365bet地区 365bet地区支持用于创建REST应用程序的量身定制的配置文件,该配置文件提供了更加集中的依赖关系和命令集

要开始使用REST概要文件,请创建一个应用程序,指定休息api作为个人资料的名称

grails创建应用程序我的api个人资料其余api

这将创建一个新的REST应用程序,该应用程序提供以下功能

  • 用于创建和生成REST端点的默认命令集

  • 默认情况下使用JSON视图呈现响应,请参见下一部分

  • 365bet地区少于默认365bet地区插件的插件否GSP否Asset Pipeline否HTML相关

您会注意到例如grails应用程序视图有的目录格森用于呈现默认索引页以及任何和错误的文件

如果发出以下命令集

grails创建我的api书的领域类grails生成我的所有api书

代替CRUD HTML接口,将生成一个生成JSON响应的REST端点。此外,默认情况下,生成的功能和单元测试将测试REST端点

AngularJS配置文件

365bet地区由于365bet地区 365bet地区支持使用AngularJS创建应用程序的配置文件,该配置文件提供了更加集中的依赖性和命令集,因此角度配置文件继承自REST配置文件,因此具有REST配置文件具有的所有命令和属性。

要开始使用AngularJS配置文件,请创建一个应用程序,指定angularjs作为个人资料的名称

grails创建我的API配置文件angularjs的应用程序

365bet地区这将创建一个新的365bet地区应用程序,该应用程序提供以下功能

  • 用于创建AngularJS工件的默认命令集

  • Gradle插件来管理客户端依赖性

  • Gradle插件执行客户端单元测试

  • Asset Pipeline插件可简化开发

默认情况下,AngularJS配置文件包括GSP支持以呈现索引页面。这是必需的,因为该配置文件是围绕资产管道设计的

新命令是

  • 创建组件

  • 创建一个控制器

  • 创建指令

  • 创建一个域

  • 创建模块

  • 创建服务

项目结构

AngularJS配置文件是围绕特定项目结构设计的。创造命令将自动创建不存在的模块

grails创建一个控制器foo

这将产生一个fooController js归档在grails应用程序资产javascripts默认程序包名称控制器.

默认情况下,angularjs配置文件将在JavaScripts目录您可以使用键在配置中更改该行为365bet地区 Codegen角资产.
grails创建一个域foo bar

这将产生一个酒吧js归档在grails应用程序资产javascripts foo域如果还不存在,它将创建foo模块

grails创建一个模块foo bar

这将产生一个foo bar js归档在grails应用程序资产javascripts foo bar请注意,模块的命名约定与其他人工制品不同

grails创建服务foo bar类型常量

这将产生一个酒吧js归档在grails应用程序资产javascripts foo服务如果尚不存在foo模块,它还将创建foo模块。创建服务命令接受一个标志类型可以使用的类型是

  • 服务

  • 默认

  • 提供者

  • 不变

除了文物本身外,配置文件还将在以下位置生成骨架单元测试文件src测试javascript对于每个创建命令

客户端依赖性

Gradle Bower插件用于通过Bower管理依赖项访问插件文档以了解如何使用插件

单元测试

Gradle Karma插件用于执行客户端单元测试。所有生成的测试均使用Jasmine编写。访问插件文档以了解如何使用插件

资产管道

AngularJS配置文件包括几个资产管道插件,以使开发更容易

角度轮廓

365bet地区由于365bet地区 365bet地区支持使用Angular创建应用程序的配置文件,该配置文件提供了面向未来的更多设置

此配置文件的最大变化是,该配置文件创建了一个多项目gradle构建。这是第一个这样做的配置文件,因此Angular配置文件依赖于角度CLI管理客户端应用程序服务器端应用程序与使用客户端创建的应用程序相同休息api轮廓

要开始使用Angular配置文件,请创建一个应用程序,指定角度的作为个人资料的名称

grails创建应用程序我的应用程序配置文件有角

这将创建一个我的应用具有以下内容的目录

客户端gradle gradlew gradlew bat服务器设置gradle

整个客户端应用程序都位于客户文件夹,整个服务器应用程序都位于服务器

先决条件

要使用此配置文件,您应该已安装Node NPM并安装了Angular CLI Node应该至少是版本,而NPM应该至少是版本

项目结构

Angular轮廓设计用于角度CLICLI用于创建概要文件的客户端应用程序端,以CLI开头。CLI提供命令来执行您希望对客户机应用程序执行的大多数操作,包括创建组件或服务,因此,概要文件本身不提供任何命令来做同样的事情

运行应用

要执行服务器端应用程序,您只能执行bootRun任务服务器项目

gradlew服务器bootRun

可以对客户端应用程序执行相同的操作

gradlew客户端bootRun

要同时执行这两个步骤,您必须并行执行

gradlew bootRun并行
必须并行执行此操作,因为默认情况下,Gradle会同步执行任务,并且bootRun任务将完成

测试中

配置文件随附的默认客户端应用程序提供了一些可以执行的测试,以便在应用程序中执行测试

Gradlew测试

测试该任务将与Karma和Jasmine一起执行单元测试

gradlew集成测试

集成测试任务将使用量角器执行电子测试

您可以执行测试集成测试每个子项目上的任务都与您相同bootRun.

因为客户端和服务器端将在单独的端口上运行,所以需要进行CORS配置默认情况下,配置文件将配置服务器端,以允许通过以下配置来自所有主机的CORS

服务器grails应用conf应用yml
ils:
    :
        已启用: 

请参阅以下部分在用户指南中获取有关根据需要配置此功能的信息

JSON视图

如上一节所述,REST概要文件默认情况下使用JSON视图来呈现JSON响应。这些响应与GSP的作用相似,但它们针对输出JSON响应而不是HTML进行了优化。

您可以继续将应用程序的逻辑驻留在控制器和服务中,从而按照MVC分离您的应用程序,而视图相关事务则由JSON视图处理

365bet地区JSON视图还提供了灵活性,可以轻松自定义呈现给客户端的JSON,而不必诉诸相对复杂的编组库,例如Jackson或365bet地区 marshaller API

365bet地区由于365bet地区团队认为365bet地区 JSON视图是向客户端显示JSON输出的最佳方法,因此从用户指南中删除了有关编写自定义编组的部分。如果您正在寻找有关该主题的信息,请参见365bet地区365bet地区 x指南.

入门

如果您使用的是REST或AngularJS配置文件,那么JSON视图插件将已经包含在内,您可以跳过本节的其余部分,否则您将需要修改您的建立gradle包括激活JSON视图所需的插件

编译'org grails插件视图json' 或最新版本
JSON视图的源代码存储库如果您正在寻找更多文档和贡献,可以在Github上找到

为了编译用于生产部署的JSON视图,您还应该通过首先修改Gradle插件来激活Gradle插件。构建脚本

buildscript依赖类路径"org grails插件视图gradle"
    }
}

然后应用org grails插件视图json365bet地区任何365bet地区核心gradle插件之后的Gradle插件

应用插入: "组织grails grails网站"应用插入: "org grails插件视图json"

这将添加一个编译GsonViews在创建生产JAR或WAR文件之前调用的Gradle任务

创建JSON视图

JSON视图进入grails应用程序视图目录并以格森后缀它们是常规的Groovy脚本,可以在任何Groovy编辑器中打开

JSON视图示例

json人名"鲍勃"
}
要在Intellij IDEA的Groovy编辑器中打开它们,请双击该文件,然后在被问到与哪个文件相关联时,选择Groovy。

上面的JSON视图产生

{"":{"":"鲍勃"}}

有一个隐含的json变量,它是流JsonBuilder.

用法示例

json1,2,3) == "[1,2,3]"json名称"鲍勃" } == '名字鲍勃'json1,2,3ñ } == 'n n n'

请参阅以下文档中的API文档:流JsonBuilder有关可能的更多信息

JSON视图模板

您可以定义以下划线开头的模板_例如,给定以下模板,格森人:

型号人人json名称人名年龄人年龄

您可以使用如下视图进行渲染

模型家庭家庭json名称家庭父亲姓名年龄家庭父亲最大年龄儿童g渲染模板:"", 模型:[家庭儿童最大人数p p年龄儿童g渲染模板:"", 采集家庭孩子:'')
}

另外一种更简洁的方式来使用tmpl变量调用模板

模型家庭家庭json名称家庭父亲姓名年龄家庭父亲年龄最大

使用JSON视图呈现域类

通常,您的模型可能涉及一个或多个域实例JSON视图提供了一种渲染这些实例的方法。

例如,给出以下域类

  {
    标题

和以下模板

模型书json g渲染书

结果输出是

{ID:1, 标题:"展台"}

您可以通过包含或排除属性来自定义渲染

json g渲染书包括:['标题']])

或通过提供闭包来添加其他JSON输出

json g呈现书页1000
}

约定的JSON视图

创建JSON视图时,可以遵循一些有用的约定,例如,如果您有一个名为然后在以下位置创建一个模板grails应用程序意见书book gson并使用响应方法将导致呈现模板

定义 (longid回应获取ID

365bet地区另外,如果默认情况下在验证过程中发生错误,365bet地区将尝试渲染一个名为365bet地区应用程序查看书错误gson否则它将尝试渲染grails应用程序查看错误error gson如果前者不存在

这很有用,因为在保留对象时,您可以响应带有验证错误以呈现上述模板

交易性
定义 (如果书籍hasErrors transactionStatus setRollbackOnly回应书籍错误其他 {
        有效对象
    }
}

如果以上示例中发生验证错误,则365bet地区应用程序查看书错误gson模板将被渲染

有关JSON视图和标记视图的更多信息,请参见JSON Views用户指南.

自定义响应渲染

如果您正在寻找更底层的API,而JSON或Markup视图不适合您的需求,那么您可能需要考虑实现自定义渲染器

自定义默认渲染器

XML和JSON的默认渲染器可以在365bet地区 Rest呈现xmlgrails rest渲染json365bet地区分别使用365bet地区转换器grails转换器XMLgrails转换器JSON默认情况下用于响应呈现

您可以使用这些默认渲染器轻松自定义响应渲染。您可能要进行的常见更改是在渲染中包括或排除某些属性

包含或排除渲染中的属性

365bet地区如前所述,365bet地区维护着365bet地区休息渲染器实例有一些默认配置的渲染器,并且能够为给定的域类甚至域类的集合注册或覆盖渲染器。要包括渲染中的特定属性,您需要通过定义一个Bean来注册自定义渲染器。grails app conf春季资源groovy:

 365bet地区 Rest呈现xml豆bookRenderer XmlRenderer包括'标题']
    }
}
365bet地区Bean名称并不重要365bet地区会扫描所有注册的渲染器Bean的应用程序上下文,但是出于组织和可读性的目的,建议您命名有意义的名称

要排除财产排除的属性XmlRenderer可以使用的类

 365bet地区 Rest呈现xml豆bookRenderer XmlRenderer排除'伊斯本']
    }
}

自定义转换器

如前所述,默认渲染使用365bet地区转换器掩盖下的包装换句话说,掩盖下的本质是

 365bet地区转换器渲染书XML格式或将书籍呈现为JSON

为什么转换器和渲染器之间要分开?为什么渲染器可以更灵活地使用您选择的任何渲染技术,在实现自定义渲染器时可以使用杰克逊, 格森365bet地区或任何用于实现渲染器的Java库另一方面,转换器与365bet地区自身的编组实现紧密相关

实施自定义渲染器

如果您希望对渲染进行更多控制,或者更喜欢使用自己的编组技术,则可以实现自己的渲染器实例例如,下面是一个简单的实现,可以自定义

myapp grails休息呈现
 grails网页mime MimeType

 BookXmlRenderer 延伸抽象渲染器BookXmlRenderer(MimeType XML MimeType TEXT XMLMimeType[])
    }

    虚空渲染宾语渲染上下文上下文上下文contentType MimeType XML名称定义XML文件groovy xml MarkupBuilder上下文编写器xml书ID对象ID标题对象标题

抽象渲染器超级类具有一个构造函数,该构造函数接受其呈现的类,并且MimeType通过渲染器的ACCEPT标头或文件扩展名接受的

要配置此渲染器,只需将其添加到grails app conf春季资源groovy:

豆bookRenderer myapp BookXmlRenderer

结果将是所有实例将以以下格式呈现

"1"标题"展台"/>
365bet地区如果将渲染更改为与上述完全不同的格式,则如果计划支持POST和PUT请求,则还需要更改绑定。365bet地区不会自动知道如何将数据从自定义XML格式绑定到域类,否则请参见有关定制信息的部分,请参见定制资源绑定

容器渲染器

一种365bet地区休息渲染ContainerRenderer是一个渲染器,用于渲染对象列表,地图集合等容器的响应。该接口与渲染器接口,除了增加了getComponentType应该返回所包含类型的方法,例如

 BookListRenderer 实施容器渲染器清单, > {
    <清单getTargetType清单 }
    <getComponentTypeMimeType[]getMimeTypes MimeType XMLMimeType[] }
    虚空渲染清单宾语渲染上下文语境

使用GSP定制渲染

您还可以使用Groovy Server Pages GSP在每个操作的基础上自定义呈现。前面提到的动作

定义 (本书回应书

您可以提供一个显示xml gsp文件以定制XML的呈现

span类注释页面span contentType span类字符串span类分隔符span类内容应用程序xml span span类分隔符span span"${书号}"标题"${书名}"/>

超媒体作为应用程序状态的引擎

帽子作为应用程序状态引擎的超媒体的缩写,是一种应用于REST体系结构的通用模式,该模式使用超媒体并通过链接来定义REST API

超媒体(也称为Mime或媒体类型)用于描述REST资源的状态,链接告诉客户端如何过渡到下一个状态。响应的格式通常为JSON或XML,尽管标准格式如原子和或东西经常使用

HAL支持

东西是开发遵循HATEOAS原理的REST API时常用的标准交换格式。代表订单列表的HAL示例示例如下所示

{
    "链接": {
        "": { "href": "订单" },
        "下一个": { "href": "订单页面" },
        "": {
            "href": "订单编号",
            "模板化": 
        },
        "管理员": [{
            "href": "管理员",
            "标题": "弗雷德"
        }, {
            "href": "管理员",
            "标题": "凯特"
        }]
    },
    "目前正在处理": 14,
    "今天发货": 20,
    "嵌入式的": {
        "订购": [{
            "链接": {
                "": { "href": "订单" },
                "": { "href": "篮子" },
                "顾客": { "href": "顾客" }
            },
            "": 30.00,
            "货币": "美元",
            "状态": "已运送"
        }, {
            "链接": {
                "": { "href": "订单" },
                "": { "href": "篮子" },
                "顾客": { "href": "顾客" }
            },
            "": 20.00,
            "货币": "美元",
            "状态": "处理中"
        }]
    }
}

使用HAL公开资源

要为资源返回HAL而不是常规JSON,您只需在以下位置覆盖渲染器即可grails app conf春季资源groovy与一个实例grails rest渲染hal HalJsonRenderer要么HalXmlRenderer用于XML变体

 grails休息渲染哈尔豆hal书本渲染器Hal JsonRenderer休息测试书

您还需要更新资源的可接受响应格式,以便包含HAL格式。否则,将导致服务器返回“不可接受”响应

可以通过设置格式的属性资源资源转型

 休息

小号'图书'格式'json', '', '案件'])
  {
    ...
}

或通过更新responseFormats在控制器中

 BookController 延伸RestfulController静态的responseFormats'json', '', '案件']

    // ...
}

在Bean到位的情况下,请求HAL内容类型将返回HAL

$卷曲我"接受应用程序Hal json" http:本地书HTTP1.1 200服务器阿帕奇郊狼1.1内容类型应用程序hal json charset ISO8859-1

{
  "链接": {
    "": {
      "href": "http本地主机书籍",
      "反射性": "",
      "类型": "应用程序hal json"
    }
  },
  "标题": "\"展台\""
}

要使用HAL XML格式,只需更改渲染器

 grails休息渲染哈尔豆halBookRenderer HalXmlRenderer其余测试书

使用HAL渲染集合

要返回HAL而不是常规JSON作为资源列表,您可以简单地在以下位置覆盖渲染器grails app conf春季资源groovy与一个实例grails rest渲染hal HalJsonCollectionRenderer:

 grails休息渲染哈尔豆halBookCollectionRenderer HalJsonCollectionRenderer其余测试书

在Bean到位的情况下,请求HAL内容类型将返回HAL

$卷曲我"接受应用程序Hal json" http:本地书HTTP1.1 200服务器阿帕奇郊狼1.1内容类型应用程序hal json charset UTF8传递编码方式大块日期周四17十月2013 02:34:14格林威治标准时间"链接": {
    "": {
      "href": "http本地主机书籍",
      "反射性": "",
      "类型": "应用程序hal json"
    }
  },
  "嵌入式的": {
    "": [
      {
        "链接": {
          "": {
            "href": "http本地主机书籍",
            "反射性": "",
            "类型": "应用程序hal json"
          }
        },
        "标题": "展台"
      },
      {
        "链接": {
          "": {
            "href": "http本地主机书籍",
            "反射性": "",
            "类型": "应用程序hal json"
          }
        },
        "标题": "无限是"
      },
      {
        "链接": {
          "": {
            "href": "http本地主机书籍",
            "反射性": "",
            "类型": "应用程序hal json"
          }
        },
        "标题": "瓦尔登"
      }
    ]
  }
}

请注意,与呈现的JSON中的对象是这是从集合中对象的类型派生的,即为了自定义此键的值,请为collectionName财产HalJsonCollectionRenderer豆如下图

 grails休息渲染哈尔豆halBookCollectionRenderer HalCollectionJsonRenderer其余测试Book collectionName'刊物'
    }
}

设置好后,渲染的HAL将如下所示

$卷曲我"接受应用程序Hal json" http:本地书HTTP1.1 200服务器阿帕奇郊狼1.1内容类型应用程序hal json charset UTF8传递编码方式大块日期周四17十月2013 02:34:14格林威治标准时间"链接": {
    "": {
      "href": "http本地主机书籍",
      "反射性": "",
      "类型": "应用程序hal json"
    }
  },
  "嵌入式的": {
    "刊物": [
      {
        "链接": {
          "": {
            "href": "http本地主机书籍",
            "反射性": "",
            "类型": "应用程序hal json"
          }
        },
        "标题": "展台"
      },
      {
        "链接": {
          "": {
            "href": "http本地主机书籍",
            "反射性": "",
            "类型": "应用程序hal json"
          }
        },
        "标题": "无限是"
      },
      {
        "链接": {
          "": {
            "href": "http本地主机书籍",
            "反射性": "",
            "类型": "应用程序hal json"
          }
        },
        "标题": "瓦尔登"
      }
    ]
  }
}

使用自定义媒体Mime类型

如果要使用自定义Mime类型,则首先需要在以下位置声明Mime类型grails应用配置会议应用程序:

grails mime类型所有:      "*/*",
    :     "应用程序vnd图书org图书json",
    bookList: "应用程序vnd图书组织图书清单json",
    ...
]
将新的mime类型放在所有Mime类型之后是至关重要的,因为如果无法建立请求的内容类型,则映射中的第一个条目将用于响应。如果您的新Mime类型位于顶部,则365bet地区将如果无法建立要求的Mime类型,请务必尝试回传您的新Mime类型

然后覆盖渲染器以使用自定义Mime类型返回HAL

 grails休息渲染哈尔
 grails网站mime豆hal书本渲染器Hal JsonRenderer休息测试书MimeType"应用程序vnd图书org图书json", [:"1.0"halBookListRenderer HalJsonCollectionRenderer其余测试书MimeType"应用程序vnd图书组织图书清单json", [:"1.0"]))
}

在上面的示例中,第一个bean为单个书本实例定义了一个HAL渲染器,该实例返回Mime Type为应用程序vnd图书org图书json第二个bean定义了在这种情况下用于呈现书籍集合的Mime Type应用程序vnd图书组织图书清单json).

应用程序vnd图书组织图书清单json是媒体范围的一个例子http www w org协议rfc rfc html标头字段定义本示例使用实体簿和操作列表来形成媒体范围值,但实际上,没有必要为每个操作创建单独的Mime类型。此外,可能没有必要在实体级别创建Mime类型。有关对REST资源进行版本控制的部分,以获取有关如何定义自己的Mime类型的更多信息

在此位置发出新Mime类型的请求将返回必要的HAL

curl i H接受应用程序vnd书籍org书籍json http本地主机书籍HTTP OK服务器Apache Coyote内容类型应用程序vnd书籍org书籍json字符集ISO链接self href http localhost书籍hreflang键入应用程序vnd书籍org书籍json标题

HATEOAS的一个重要方面是链接的使用,这些链接描述了客户端可用于与REST API进行交互的过渡。默认情况下,哈尔森渲染器会使用自我关系自动为您创建链接以进行关联并链接到资源本身

不过,您可以使用链接添加到所有带注释的域类中的方法grails rest资源或任何带有注释的类grails rest可链接例如可以将操作修改如下,以在结果输出中提供新的链接

定义 (图书图书链接rel:'发布者', hrefg createLink绝对: , 资源:"发布者", 参数:[bookId书号回应书

这将导致诸如

{
  "链接": {
    "": {
      "href": "http本地主机书籍",
      "反射性": "",
      "类型": "应用程序vnd图书org图书json"
    }
    "发布者": {
        "href": "http本地主机图书出版商",
        "反射性": ""
    }
  },
  "标题": "\"展台\""
}

链接可以传递与属性相匹配的命名参数grails rest链接

原子支持

原子是用于实现REST API的另一种标准交换格式。Atom输出的示例如下所示


<> xmlns="http www w org Atom">

 span示例Feed span类标签
 <> href="http示例org"/>
 Z
 
   约翰·杜
 
 c c a d d c C af

 
   span Atom Powered Robots Run Amok span class标签
   <> href="http示例org atom"/>
   ur uuid c cfb ebb aaaa da efa a
   Z
   一些文字
 

要再次使用Atom渲染,只需定义一个自定义渲染器

 365bet地区休息呈现原子豆halBookRenderer AtomRenderer休息测试书halBookListRenderer AtomCollectionRenderer休息测试书

Vnd错误支持

Vnd错误是表达错误响应的标准化方法

默认情况下,当尝试发布新资源时发生验证错误时,错误对象将被发送回allow并带有响应代码

$卷曲我"接受应用程序json"H"内容类型应用程序json"X开机自检"" http:本地书HTTP1.1 422无法处理实体
服务器阿帕奇郊狼1.1内容类型应用程序json charset ISO8859-1

{
  "错误": [
    {
      "宾语": "休息测试书",
      "领域": "标题",
      "拒绝值": 空值,
      "信息": "类class rest test Book的属性标题不能为null"
    }
  ]
}

如果您希望将格式更改为Vnd Error,则只需注册grails rest渲染错误VndErrorJsonRenderer豆入grails app conf春季资源groovy:

Bean vndJsonErrorRenderer失败,其余渲染错误VndErrorJsonRendererVnd错误XML格式vndXmlErrorRenderer导致其余渲染错误VndErrorXmlRenderer

然后,如果您更改客户端请求以接受Vnd错误,则会得到适当的响应

$卷曲我"接受应用程序vnd错误json应用程序json"H"内容类型应用程序json"X开机自检"" http:本地书HTTP1.1 200服务器阿帕奇郊狼1.1内容类型应用程序vnd错误json字符集ISO8859-1

[
    {
        "对数引用": "可空的书
        "信息": "类class rest test Book的属性标题不能为null",
        "链接": {
            "资源": {
                "href": "http localhost休息测试书"
            }
        }
    }
]

定制资源绑定

该框架提供了一种复杂但简单的机制,用于将REST请求绑定到域对象和命令对象。一种利用此方法的方法是将控制器中的属性属性给定以下XML作为请求主体,createBook行动将创造一个新的并将支架分配给标题财产和斯蒂芬·金authorName属性

"1.0"编码方式"UTF"?>