什么是Web Services?
Web Services 是独立的(self-contained)并可自我描述
- Web Services 可通过使用UDDI来发现
- Web Services 可被其他应用程序使用
- XML 是 Web Services 的基础
Web services 平台的元素
- SOAP (简易对象访问协议)
- UDDI (通用描述、发现及整合)
- WSDL (Web services 描述语言)
什么是 SOAP?
基本的 Web services 平台是 XML + HTTP。
- SOAP 指简易对象访问协议
- SOAP 是一种通信协议
- SOAP 用于应用程序之间的通信
- SOAP 是一种用于发送消息的格式
- SOAP 被设计用来通过因特网进行通信
- SOAP 独立于平台
- SOAP 独立于语言
- SOAP 基于 XML
- SOAP 很简单并可扩展
- SOAP 允许您绕过防火墙
- SOAP 将作为 W3C 标准来发展
什么是 WSDL?
WSDL 是基于 XML 的用于描述 Web Services 以及如何访问 Web Services 的语言。
- WSDL 指网络服务描述语言
- WSDL 使用 XML 编写
- WSDL 是一种 XML 文档
- WSDL 用于描述网络服务
- WSDL 也可用于定位网络服务
- WSDL 还不是 W3C 标准
- wsdl例子
什么是UDDI?
- UDDI 是一种目录服务,通过它,企业可注册并搜索 Web services。
- UDDI 指通用的描述、发现以及整合(Universal Description, Discovery and Integration)。
- UDDI 是一种用于存储有关 web services 的信息的目录。
- UDDI 是一种由 WSDL 描述的网络服务接口目录。
- UDDI 经由 SOAP 进行通迅。
- UDDI 被构建于 Microsoft .NET 平台之中。
调试工具
SOAP和HTTP区别
- 请求消息格式不同
- 响应消息格式不同
- 安全机制不同
- 客户端调用方式不同
- 并发处理能力的不同
在Rails下如何调用SOAP接口
官方文档
1
2
3
4
5
6
7
8
9
10
11
| # create a client for the service
client = Savon.client(wsdl: 'http://service.example.com?wsdl')
client.operations
# => [:find_user, :list_users]
# call the 'findUser' operation
response = client.call(:find_user, message: { id: 42 })
response.body
# => { find_user_response: { id: 42, name: 'Hoff' } }
|
实际例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| class SoapWithSavon
class << self
# TODO: should use settin
def client
@client ||= Savon.client do
# WSDL 接口
wsdl "http://192.168.0.22:8000/sap/bc/srt/wsdl/srvc_5618AD468DEB07E0E1008000C0A80016/wsdl11/allinone/ws_policy/document?sap-client=300"
# 用户验证
basic_auth "CRMINTERFACE", "123456"
end
end
# 默认同步昨天的设备数据
def get_devices (start_at = 1.day.ago, end_at = 1.day.ago)
start_at_format = start_at.strftime("%Y-%m-%d")
end_at_format = end_at.strftime("%Y-%m-%d")
response = call_and_fail_gracefully(:z_wl_material, :message => { "EAssetMatnr" => {}, "ImUdate1" => start_at_format, "ImUdate2" => end_at_format })
if response.body[:z_wl_material_response][:e_msgty] == "E"
logger.info response.body[:z_wl_material_response][:e_ermsg]
[]
else
response.body[:z_wl_material_response][:e_asset_matnr][:item]
end
end
def logger
@@logger ||= Logger.new('./log/soap_with_savon.log')
end
def call_and_fail_gracefully(*args, &block)
client.call(*args, &block)
rescue Savon::SOAPFault => e
logger.info e
rescue Savon::HTTPError => e
# HTTP Error
logger.info e
rescue Savon::InvalidResponseError => e
# InvalidResponseError
logger.info e
end
end
end
|
参考文档
savon
AWS PaaS API参考指南