`

Rails下的Web Service开发简介

阅读更多
创建

先用generator 来创建service 参数为

generator web_service ServiceOne method_a method_b


rails会创建一个service_one_api.rb在/app/apis下,同时有service_one_controller在/app/controllers/下

注意 因为ruby完全动态,所以无法根据方法接口来自动生成webservice, 所以搞了一个xxx_api.rb来干这个事情, 注意 rails对于对象之间的关系不会暴露到webservice外面去,只是简单的把字段id写出去
方法申明

在xxxx_api.rb中负责定义方法的参数, 定义一个web方法如下

api_method :xxxmethod_name, :expects=>... ,:returns =>

#:expects 如果忽略表示不能传递参数 :returns 忽略表示返回为空


它们接收的参数只能是如下情况之一

    * symbol或者string 的基本类型
    * Class类型只支持ActionWebService::Struct或者ActiveRecord::Base子类
    * 一个包含前面2个类型参数的数组
    * 一个包含前面3个类型参数的hash 用来表明webservice参数名 (webservice友好)

比如 [[:string]] [Person] [{:lastname=>:string}] [:int,:int]

基本类型为 :int :string :base64(会自动转为binary来传送文件) :bool :float :time :datetime(Ruby的DateTime) :date(Ruby的Date) 除此以为均非法

在Contoller中有如下指令

    * wsdl_service_name 'SomeName' 设定当前service的名字(说不是必须的)
    * wsdl_namespace 'http://xxx' 设定namespace 默扔为'urn:ActionWebService'
    * web_service_api XXXApi 关联controller和他的api类,如果是符合命名规范,可以省略此指令
    * web_service_scaffold :somemethod 生成一个action能提供一个直接体验webservice的web界面,方便调试
    * web_service_dispatching_mode :layered | :delegated 设置dispatch mode, 省略表示 direct

ActionWebService::Struct 使用

这个类是用来帮助组织webservice可以识别的数据对象(DTO) 通过member方法来定义域和类型, 例子如下

class Person < ActionWebService::Struct
    member :id, :int
    member :name, :string
end

webservice 分派方式

通过web_service_dispatching_mode来申明分派方式, 注意不要写错了,写错了rails不报错,而且能给出无用但是合付xml文法的wsdl(一个没有任何方法的服务)

    * 直接分配, 实现写在生成的controller中


      layered dispatching 单独实现ActionWebService::Base的子类(放在apis目录下),定义public方法即可

      class ProductService < ActionWebService::Base
      web_service_api ProductApi
      def find_all_products Product.find(:all).map{ |product| product.id end }
      def find_product_by_id(id) Product.find(id) end end


      delegated dispatching

申明web_service_dispatching_mode以后,使用web_service :my_serv_name ,XXXXService.new(相对静态生成) 或者web_service :my_name {XXXService.new} 作延迟加载(可以在block中访问controller的变量了,同时也可以对my_name这个新添加的service_action作filter 了)

具体的三种方法我还没有感觉出有什么特别用处,目前对webservice认识还不足
对webservice作 AOP 拦截

支持 before_invocation和after_invocation (:only 和 :except 语法), 如果before_invocation返回false或者抛出异常或者直接return[false,"reason"], 调用都会中止

拦截方法接收两个参数, 一个method_name, 一个method参数数组) 和 其他拦截类似, 还可以传入block(|sourceobj,m_name,m_params|) 和实现拦截类(只要实现interceptor(m_name,m_params)来拦截
webservice的测试

默认已经生成好functional test

使用invoke来调用直接的servcie, 类似还有

invoke_layered(service_name, method_name, *args) invoke_delegated(service_name, method_name, *args)
url对应关系

SOAP

默认controller有一个wsdl的action可以得到wsdl描述文件,通过service.wsdl也一样可以得到(routes.rb创建的),通过这个wsdl就可以得到所有的url信息了

XML-PRC (没有wsdl的情况) (其实在wsdl下方可以看到这些url,一样是对XML-PRC有效的

layered dispatching

http://host/PATH/TO/CONTROLLER/api

delegated dispatching

http://host/PATH/TO/CONTROLLER/SERVICE_NAME


这里的SERVICE_NAME就是web_service()方法的第一个参数
调用外部webservice

在rails controller内部,通过 web_client_api :product,:soap, 'http://url' 就可以创建一个product方法代理服务,使用product.xxx即可

还可以使用ActionWebService::Client::Soap或者ActionWebService::Client::XmlRpc 来基于Api定义的类直接创建对象 shop
=ActionWebService::Client::Soap.new(ProductApi,"http://my.app.com/backend/api") product = shop.find_product_by_id(5)


如果服务和rails关联不紧密, 就使用ruby的webservice包,不必用rails的了
分享到:
评论

相关推荐

    Web开发敏捷之道-应用Rails进行敏捷Web开发(第3版).pdf

    《Web开发敏捷之道:应用Rails进行敏捷Web开发(第3版)》:Ruby on Rails是一个全套的MVC web框架,它能帮你开发高质量又美观的web应用,而且开发速度快得出乎你想象。你只须集中精力于应用程序本身,Rails就会帮你...

    Web开发敏捷之道-应用Rails进行敏捷Web开发(第三版)

    全书主要内容分为两大...尤为值得一提的是本部分的后几章:作者先后介绍了Web 2.0、Web Service等流行技术在Rails中的支持,然后又凭借丰富的实践经验介绍了Rails在安全性、伸缩性、部署等方面的常见问题和解决方案。

    Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rar

    相比第2版中的内容,Rails 2增加了REST、资源、轻量级web service等新特性。本书涵盖了这些全新的内容,因此能更好地体现出Rails框架的发展现状。 整体而言,全书既有直观的实例,又有深入的分析,同时还涵盖了web...

    Web.Services.on.Rails.

    《Web.Services.on.Rails》是一本专注于在Rails框架下构建Web服务的专著。Rails,作为Ruby编程语言的一个流行Web开发框架,以其简洁、高效和DRY(Don't Repeat Yourself)的原则深受开发者喜爱。Web服务则是一种允许...

    centOS Rails3环境搭建

    ### CentOS环境下Rails 3开发环境搭建详解 #### 一、准备工作与环境配置 在开始部署Rails 3开发环境之前,我们需要确保系统上已经安装了一些基本的软件包和工具。这一步骤对于后续的Ruby和Rails安装至关重要。 ##...

    RESTful Web Service 课件下载.pdf

    - **基于SOAP协议的Web Services时代**:随着Microsoft推出.NET平台,Web Services概念被广泛推广,尽管其间曾遭遇挫折,但在IBM和BEA的推动下,SOA(Service-Oriented Architecture)重新崛起。 - **CORBA与EJB的...

    rails-handbook:描述Infinum Rails团队使用的开发过程

    在Rails开发中,常见的模式如Repository模式用于解耦模型和数据访问层,Service Object模式用于封装复杂业务逻辑,以及Presenter模式用于处理视图层的数据展示。理解并灵活运用这些模式,能使代码更加清晰、模块化。...

    ruby_on_rails&radrails环境配置.pdf

    #### 一、Ruby on Rails简介 Ruby on Rails(简称Rails或RoR)是一种使用Ruby语言编写的开源全栈Web应用框架。它遵循模型-视图-控制器(MVC)架构模式,强调代码优雅性和开发效率,通过约定优于配置的理念简化了...

    SOA系列:开源框架Ruby on Rails

    2. **全栈支持**:作为一款全栈框架,Rails 同时支持前端和后端的开发,这意味着开发者可以在一个框架下完成整个 Web 应用的构建,无需切换不同的工具或技术栈。 3. **高效的开发效率**:Rails 提供了一系列的工具...

    Ruby-AssetSync在Rails和S3同步Web资源

    Ruby-AssetSync是一个用于Rails应用的Gem,它帮助开发者将前端资源,如CSS、JavaScript、图片等,自动同步到Amazon S3(Simple Storage Service)上。这样做的主要目的是提高Web应用的性能,尤其是在处理静态资产时...

    Addison.Wesley.Service-Oriented.Design.with.Ruby.and.Rails

    2. **Rails框架**:Rails是一个基于Ruby的Web开发框架,它遵循“约定优于配置”的原则,简化了许多常见的Web开发任务。Rails内置了一系列工具和服务,可以帮助开发者快速搭建RESTful API,从而支持服务导向的设计。 ...

    Ruby on Rails实践之路给PHP和Java开发者的书

    Ruby on Rails,简称RoR,是由David Heinemeier Hansson基于Ruby语言开发的一款开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和可读性,使得开发者能够更快速地构建功能丰富的web...

    ServiceFramework.zip

    所以ServcieFramework非常强调开发的高效性,其开发效率可以比肩Rails(不相信?可以体验一下哦)。 拥有Java界最简单,非常高效,且真正的富Model层 Controller层含有便利的函数库,简洁高效的验证器,过滤器 简单但...

    Laravel开发-laravel-adwords-targeting-idea-service

    在本文中,我们将深入探讨如何使用Laravel框架开发与Google AdWords Targeting Idea Service集成的应用。Laravel是一款优雅、强大的PHP框架,它为开发者提供了丰富的工具和结构,以简化Web应用的开发过程。AdWords ...

    Beginning Google Maps Applications with Rails and Ajax

    - **定义**:Ruby on Rails(简称Rails)是一种用于快速开发Web应用程序的开源框架。它采用了Model-View-Controller(MVC)架构模式,简化了数据库操作和网页布局的设计过程。 - **优势**:Rails框架以“约定优于...

    rails-service-rdbms-template:使用关系数据库的新Rails服务模板

    NAME DB_USER DB_PASSWORD DB_HOST REDIS_URL NEW_RELIC_APP_NAME NEW_RELIC_LICENSE_KEY SENTRY_DSN SENTRY_SERVICE SENTRY_ENVIRONMENT WEB_CONCURRENCY美洲狮工人的数量每个工作人员MAX_THREADS个线程PORT默认值...

    Linux系统平台上安装和配置Ruby on Rails

    在Linux系统上安装和配置Ruby on Rails是一个常见的任务,特别是在开发Web应用程序时。Ruby on Rails(RoR)是一个基于Ruby语言的开源Web应用框架,它遵循模型-视图-控制器(MVC)架构模式,强调简洁和生产力。在...

    go-rails-template:在Ruby On Rails中构建大型Web应用程序的模板。 专注于扩展,性能和最佳实践

    GO Rails模板在Ruby On Rails中构建大型Web应用程序的模板。 通过应用以下模式来关注扩展,性能和最佳实践:服务对象,表单对象,查询对象,计算对象,值对象,策略对象,装饰器等。 由与 :red_heart:一般信息Ruby...

    rails 文件上传

    在Ruby on Rails框架中,文件上传是一个常见的需求,特别是在构建Web应用时,用户可能需要上传图片、文档等。Rails提供了一种优雅的方式来处理文件上传,包括存储管理、处理和验证。这篇博文“rails 文件上传”可能...

Global site tag (gtag.js) - Google Analytics