热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

rails笔记:webservice

webservice创建先用generator来创建service参数为generatorweb_serviceServiceOnemethod_amethod_brails会创建

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 end

webservice 分派方式

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

  • 直接分配, 实现写在生成的controller中
  • layered dispatching 单独实现ActionWebService::Base的子类(放在apis目录下),定义public方法即可

    class ProductService 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的了

转:https://www.cnblogs.com/baoz/archive/2006/01/24/2269864.html



推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
author-avatar
gaoxuxinyue23
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有