ror的webservice

来源:互联网 发布:淘宝鳄鱼宠物哪里有卖 编辑:程序博客网 时间:2024/06/01 10:36

所谓SOA,我的理解就是把service分开的项目, 分开的service就是webservice ,各个service通

过SOAP进行xml通信,只不过其中的xml字段可能还有一些方法名之类需要后来生成一下,故起个名叫

wsdl,注意到最近db2 9.5 添加了xml字段,呵呵 , ibm推动SOA动作很大啊

 

well , 既然是xml , 大家都可以使用,这样, 我们不妨自己写个程序发送,接受xml ,使得一个程序

实现了webservice功能,ror没有啥wsdl自动生成工具,自己敲代码吧。。。要不我们别用那么麻烦的东

西了,一个简单的webservice就行了

 

搜了一下中国现在没啥webservice发布呢,还是终于原作,写个简单的 webservice把

 

ror 2.1.0, db2 9.5,ibm_db 0.9.4(下周rake就好用了),ide apatana 3.2生成个

sample project

 

然后我们scaffold一下一个addresses , 里面字段 id:int state:string city:string去

view中修改一下,该删得删,最好都删,添加一条语句很重要:

 

<%= render :partial => 'form' %>

 

然后添加一个文件,叫form.rhtml里面有各种field ,别少了关键的address_zip5和要update的

address_state 和 address_city 的field,大概如下:

<%= javascript_include_tag "prototype" %>

<p><label for="address_street">Street</label><br/>

<%= text_field 'address', 'street'  %></p>

 

<p><label for="address_zip5">Zip5</label><br/>

<%= text_field 'address', 'zip5', :size => "9", :maxlength => "5"  %></p>

 

<div id = "ajaxLookup">

  <%= render :partial => "cityStateFields" %>

</div>

 

<%= observe_field :address_zip5,

                  :frequency    => 2.00,

                  :update       => "ajaxLookup",

                  :url          => {:action => :cityStateSearch, :id

=>@address},

                  :with         => "'zip5=' + encodeURIComponent(value)"

%>

 

最下面的tag使用了ajax的prototype的一个tag标签,其实使用ajax就是使用标签哈,该标签意思是检

查叶面上叫address_zip5的东西,每2秒查一次,如果改变则执行本controller下面叫

cityStateSearch的action ,这个action负责将xml请求发出去,并接受查询后xml结果,形成一个

webservice,这里用的是美国邮局编码查询的webservice大致如下:

 

def cityStateSearch

           

#建立xml请求,userid 是我地

xm = Builder::XmlMarkup.new

      xmlstuff = xm.CityStateLookupRequest("USERID"=>"566ISSC05163") {

      xm.ZipCode("ID"=>"0") {#区号

        xm.Zip5(params[:zip5]) }}#邮政编码号

      uri_enc = URI.escape#这里写uripattern

('http://testing.shippingapis.com/ShippingAPITest.dll?

API=CityStateLookup&XML=' + xmlstuff)

API=CityStateLookup&XML=' + xmlstuff)

 

      uri = URI.parse(uri_enc)#发送请求,得到xml

 

      doc = REXML::Document.new open(uri)#解析

      doc.elements.each("CityStateLookupResponse/ZipCode") { |element|

        @address.city = element[1].text#解析元素,按照请求条件

        @address.state = element[2].text

      }

 

render :partial => "cityStateFields"#重新导入页片

end

 

注意由于其中有些REXML等默认是不识别的,所以我们要导入,controller 前面加上

require 'open-uri'

require 'uri'

require 'rubygems'

require 'builder'

require "rexml/document"

 

做一下吧, 肯定有收获参考文献
原创粉丝点击