WebService 简单使用

什么是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参考指南

Comments