Grails开发Web服务

Web服务是指在Web程序中提供Web的应用程序接口(API),它有SOAP和REST两种典型的实现方式。


REST
REST并不是一个独立成技术,只能说是一种架构模式。REST相当简单,只限于使用XML或JSON纯文本作为传播介质,以及使用URL模式,而这些模式代表底层系统和HTTP方法(比如GET、PUT、POST和DELETE)。

每个HTTP方法都映射到一个行为(action)。例如,GET表示获取数据,PUT表示创建数据,POST表示更新,等等。

这样一来,就让人感觉,REST非常适合CRUD(Create创建+Retrieve获取+Update更新+Delete删除)。

URL模式

Grails实现REST的第一步是提供RESTful的URL映射

static mappings = {
   "/product/$id?"(controller:"product"){
       action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"]
   } 
}
这里我们使用URL映射的能力,映射到HTTP方法,从而给控制器提供RESTful的API。每个HTTP方法(比如GET、PUT、POST、DELETE)都映射到控制器中唯一的行为。
XML编组(Marshal)——只读方法
控制器实现本身可以使用Grails的XML编组功能,来实现GET方法:
import grails.converters.*
class ProductController {
 def show = {
  if(params.id && Product.exists(params.id)) {
   def p = Product.findByName(params.id)
   render p as XML
  }
  else {
   def all = Product.list()
   render all as XML
  }
 }
 ..
}
我们在这里做的是:如果我们通过name搜索到了一个产品,那么就返回这个产品;否则返回所有产品。这样,如果我们访问/products,就可以获取所有产品,或者访问/product/MacBook,那我们就可以得到一个产品MacBook。
XML编组——更新方法

Grails能够读取传入的XML包,来加强params对象。你可以使用这些params对象,从而支持更新方法(比如PUT和POST)。假设传入的XML包如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<product>
 <name>MacBook</name>
 <vendor id="12">
  <name>Apple</name>
     </vender>
</product>
你可以使用《数据绑定》章节讲到的相同技术,通过params对象来读取XML包。
def save = {
 def p = new Product(params['product'])

if(p.save()) { render p as XML } else { def errors = p.errors.allErrors.collect { g.message(error:it) } render(contentType:"text/xml") { error { for(err in errors) { message(error:err) } } } } }

本例中,我们使用关键字'product',创建params对象的索引,从而能够使用Product类的构造器,来创建和绑定XML。下行有一个有趣之处:
def p = new Product(params['product'])
也就是不需要更改代码,就可以用处理XML请求的方式,来处理提交表单数据的提交操作。相同的技术也可以应用于JSON请求。
###如果你需要对不同的客户端(REST、HTML,等等)进行不同的响应,那么就可以使用内容协商(content negotation )###
然后,Product对象被保存,并以XML形式显示(render),否则,就使用Grails的表单中的验证能力,产生错误信息。
<error>
   <message>The property 'title' of class 'Person' must be specified</message>
</error>
SOAP
Grails可以使用XFire插件实现对SOAP的支持。XFire插件使用谈广受欢迎的XFire SOAP 栈,将SOAP支持集成到Grails中。XFire允许使用专门的expose属性,将Grails服务显示为SOAP服务。
class BookService {

static expose=['xfire']

Book[] getBooks(){ Book.list() as Book[] } }

然后就可以通过以下地址访问WSDL:
http://127.0.0.1:8080/your_grails_app/services/book?wsdl

关于XFire插件的更多信息,请参考wiki中的文档

RSS和Atom


Grails中并不提供对RSS和Atom的直接支持。你可以使用render方法的XML功能,来构造RSS或ATOM的Feeds。然而,Grails还有一个Feeds插件,使用流行的ROME库,提供RSS和Atom构造器(builder)。这种用法的例子如下:

 
def feed = {
    render(feedType:"rss", feedVersion:"2.0") {
        title = "My test feed"
        link = "http://your.test.server/yourController/feed"

Article.list().each() { entry(it.title) { link = "http://your.test.server/article/${it.id}" it.content // return the content } } } }

锐飞人翻译自Grails1.0文档. http://grails1.0api.cn/

 
1. 简介 2. 起步 2.1 下载并安装Grails 2.2 创建一个Grails应用 2.3 Hello World示例 2.4 使用IDE 2.5 规约配置 2.6 运行Grails应用 2.7 测试Grails应用 2.8 部署Grails应用 2.9 所支持的Java EE容器 2.10 创建工件 2.11 生成Grails应用 3. 配置 3.1 基本配置 3.1.1 内置选项 3.1.2 日志 3.2 环境 3.3 数据源 3.3.1 数据源和环境 3.3.2 JNDI数据源 3.3.3 自动数据库移植 3.4 外部配置 3.5 定义版本 4. 命令行 4.1 创建Gant脚本 4.2 可复用的Grails脚本 4.3 脚本中的事件 4.4 Ant和Maven 5. 对象关系映射(GORM) 5.1 快速指南 5.1.1 基本的CRUD 5.2 在GORM中进行领域建模 5.2.1 GORM中的关联 5.2.1.1 一对一 5.2.1.2 一对多 5.2.1.3 多对多 5.2.2 GORM的组合 5.2.3 GORM的继承 5.2.4 集合、列表和映射 5.3 持久化基础 5.3.1 保存和更新 5.3.2 删除对象 5.3.3 级联更新和删除 5.3.4 立即加载和延迟加载 5.3.4 悲观锁和乐观锁 5.4 GORM查询 5.4.1 动态查找器 5.4.2 条件查询 5.4.3 Hibernate查询语言 5.5 高级GORM特性 5.5.1 事件和自动实现时间戳 5.5.2 自定义ORM映射 5.5.2.1 表名和列名 5.5.2.2 缓存策略 5.5.2.3 继承策略 5.5.2.4 自定义数据库标识符 5.5.2.5 复合主键 5.5.2.6 数据库索引 5.5.2.7 乐观锁和版本定义 5.5.2.8 立即加载和延迟加载 5.6 事务编程 5.7 GORM和约束 6. Web层 6.1 控制器 6.1.1 理解控制器和操作 6.1.2 控制器和作用域 6.1.3 模型和视图 6.1.4 重定向和链 6.1.5 控制器拦截器 6.1.6 数据绑定 6.1.7 XML和JSON响应 6.1.8 上传文件 6.1.9 命令对象 6.2 Groovy Server Pages 6.2.1 GSP基础 6.2.1.1 变量和作用域 6.2.1.2 逻辑和迭代 6.2.1.3 页面指令 6.2.1.4 表达式 6.2.2 GSP标签 6.2.2.1 变量和作用域 6.2.2.2 逻辑和迭代 6.2.2.3 搜索和过滤 6.2.2.4 链接和资源 6.2.2.5 表单和字段 6.2.2.6 标签作为方法调用 6.2.3 视图和模板 6.2.4 使用Sitemesh布局 6.3 标签库 6.3.1 简单标签 6.3.2 逻辑标签 6.3.3 迭代标签 6.3.4 标签命名空间 6.4 URL映射 6.4.1 映射到控制器和操作 6.4.2 嵌入式变量 6.4.3 映射到视图 6.4.4 映射到响应代码 6.4.5 映射到HTTP方法 6.4.6 映射通配符 6.4.7 自动重写链接 6.4.8 应用约束 6.5 Web Flow 6.5.1 开始和结束状态 6.5.2 操作状态和视图状态 6.5.3 流执行事件 6.5.4 流的作用域 6.5.5 数据绑定和验证 6.5.6 子流程和会话 6.6 过滤器 6.6.1 应用过滤器 6.6.2 过滤器的类型 6.6.3 过滤器的功能 6.7 Ajax 6.7.1 用Prototype实现Ajax 6.7.1.1 异步链接 6.7.1.2 更新内容 6.7.1.3 异步表单提交 6.7.1.4 Ajax事件 6.7.2 用Dojo实现Ajax 6.7.3 用GWT实现Ajax 6.7.4 服务端的Ajax 6.8 内容协商 7. 验证 7.1 声明约束 7.2 验证约束 7.3 客户端验证 7.4 验证和国际化 8. 服务层 8.1 声明式事务 8.2 服务的作用域 8.3 依赖注入和服务 8.4 使用Java的服务 9. 测试 9.1 单元测试 9.2 集成测试 9.3 功能测试 10. 国际化 10.1 理解信息绑定 10.2 改变Locales 10.3 读取信息 11. 安全 11.1 预防攻击 11.2 字符串的编码和解码 11.3 身份验证 11.4 关于安全的插件 11.4.1 Acegi 11.4.2 JSecurity 12 插件 12.1 创建和安装插件 12.2 理解插件的结构 12.3 提供基础的工件 12.4 评估规约 12.5 参与构建事件 12.6 参与运行时配置 12.7 运行时添加动态方法 12.8 参与自动重载 12.9 理解插件加载的顺序 13. Web服务 13.1 REST 13.2 SOAP 13.3 RSS和Atom 14. Grails和Spring 14.1 Grails的支柱 14.2 配置其他Bean 14.3 通过Beans DSL运行Spring 14.4 配置属性占位 14.5 配置属性重载 15. Grails和Hibernate 15.1 通过Hibernate注释进行映射 15.2 深入了解 16. 脚手架
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值