所谓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"
做一下吧 , 肯定有收获 参考文献