Sử dụng gem savon Phần I

I. Giới thiệu 1. Savon là dùng để sử dụng để giao tiếp với các hệ thống SOAP. SOAP(Simple Object Access Protocol) là một giao thức do W3C định nghĩa [1]. SOAP áp dụng XML để xác định dữ liệu dạng văn bản (plain text) qua HTTP và SMTP. Web Service dùng SOAP trong quá trình truyền tải dữ liệu. SOAP không phụ thuộc ngôn ngữ lập trình hay bất cứ nền tảng nào vì nó dùng XML. 2. Cài đặt Đề sử dụng gem savon cho rails application ta add vào Gemfile

       gem 'savon', '~> 2.0'
Chạy
`$ bundle install`
để cài đặt `gem`

Cách 2 là cài đặt trực tiếp
gem install savon --version '~> 2.0'

`$ gem install savon --version '~> 2.0'`

Các khách hàng mới là được hỗ trợ trở nên đơn giản hơn nhiều để sử dụng, bởi vì tất cả mọi thứ trong `Savon 2.0` được dựa trên một định nghĩa trên các thiết lập tùy trọn. Để tạo ra một khách hàng mới dựa trên một tài liệu WSDL, bạn có thể thiết lập tùy chọn `:wsdl` bằng cách thiết lập 1 Hash đến Savon.client. Constructor của khách hàng chấp nhận lựa chọn khác nhau và cung cấp cho một dịch vụ phù hợp.
        SAVON_CLIENT = Savon.client wsdl: "http://ws.interfax.net/dfs.asmx?wsdl"
Cùng với giao diện Hash trên đơn giản, Savon cũng có thể khai báo bằng block. Này trông quen thuộc với bạn nếu bạn sử dụng các phiên bản `Savon 1.x`.
        SAVON_CLIENT = Savon.client do
          wsdl "http://ws.interfax.net/dfs.asmx?wsdl"
        end
Nhược điểm của cách khai báo này là, nó không cho phép bạn sử dụng các biến bên trong khối. Bạn chỉ có thể sử dụng các biến địa phương hoặc các phương pháp gọi trên lớp của bạn. Nếu bạn không nhớ cách gõ một vài ký tự hơn, bạn có thể chấp nhận một đối số trong khối của bạn và Savon đơn giản sẽ mang lại các tùy chọn với nó. Bằng cách đó, bạn có thể sử dụng như nhiều biến như bạn muốn.
        SAVON_CLIENT = Savon.client do |globals|
          globals.wsdl @wsdl
        end
Trong trường hợp dịch vụ của bạn không có một `WSDL`, bạn có thể cần phải cung cấp Savon với nhiều lựa chọn khác. Ví dụ, Savon cần biết về  `endpoint` SOAP và `namespace` của dịch vụ.
        SAVON_CLIENT = Savon.client do
          endpoint "http://interfax.net"
          namespace "http://interfax.net"
        end
Nếu `client` đã tồn tại để gửi `messages` ta có thể thực hiện.
       SAVON_CLIENT.call :sendfax, message:{
          "Username" => ENV["FAX_USER_NAME"],
          "Password" => ENV["FAX_PASSWORD"],
          "FaxNumber" => fax_number,
          "FileData" => Base64.encode64(File.binread(file_path)),
          "FileType" => "PDF"
        }
2. Gloabl
Tùy chọn `global` được truyền cho constructor của client và được cụ thể cho một dịch vụ.

Mặc dù chúng được gọi là global options, nhưng thực sự là chỉ đến một trường hợp khách hàng. Savon version 1 đã được dựa trên một phương pháp Savon.configure để lưu cấu hình. - wsdl
Savon chấp nhận hoặc là một tài liệu WSDL hoặc từ remoete mà nó sử dụng để trích xuất thông tin như điểm cuối SOAP và mục tiêu là tên của dịch vụ.

        Savon.client(wsdl: "http://ws.interfax.net/dfs.asmx?wsdl")
        Savon.client(wsdl: "/FRAMGIA/bui.van.quynh/rails_apps/test.wsdl")
    - endpoint and namespace<br>
    Trong trường hợp dịch vụ của bạn không cung cấp một `WSDL`, bạn cần phải cho `Savon` về  `endpoint` SOAP và `namespace` của dịch vụ.
    <br>
    Các `namespace` mục tiêu được sử dụng cho `namespace` thông điệp SOAP. Trong một WSDL, `namespace` mục tiêu được xác định trên `wsdl:definitions`, cùng với tên service và `namespace` của service.
        <wsdl:definitions
          name="AuthenticationWebServiceImplService"
          targetNamespace="http://v1_0.ws.auth.order.example.com/"
          xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
        </wsdl:definitions>
          <wsdl:service name="AuthenticationWebServiceImplService">
            <wsdl:port binding="tns:AuthenticationWebServiceImplServiceSoapBinding" name="AuthenticationWebServiceImplPort">
              <soap:address location="http://example.com/validation/1.0/AuthenticationService" />
            </wsdl:port>
          </wsdl:service>
    SOAP `endpoint` là URL mà tại đó dịch vụ của bạn chấp nhận các yêu cầu SOAP. Nó thường được định nghĩa ở dưới cùng của một WSDL, như là thuộc tính `location` của `soap:address`.
    Bạn cũng có thể sử dụng các tùy chọn này để ghi đè lên các giá trị trong một tài liệu `WSDL` trong trường hợp bạn cần.
    - raise_errors <br>
    Theo mặc định, `Savon` bắn lỗi `SOAP` và các lỗi HTTP. Bạn có thể vô hiệu hóa các lỗi và truy vấn thay thế.
        Savon.client(raise_errors: false)
    - HTTP<br>
        + proxy<br>
        Bạn có thể chỉ định một máy chủ proxy để sử dụng. Điều này sẽ được sử dụng để lấy tài liệu WSDL từ xa và yêu cầu SOAP thực hiện.
            Savon.client(proxy: "http://example.org")
        + headers<br>
        Bạn có thể thêm `header` vào request
            Savon.client(headers: { "Authentication" => "secret" })
        + timeouts<br>
        Tât cả thời gian chờ mở và đọc có thể được thiết lập (tính bằng giây). Điều này sẽ được sử dụng để lấy tài liệu WSDL từ xa và yêu cầu SOAP.
             Savon.client(open_timeout: 5, read_timeout: 5)
        Savon.client(open_timeout: 5, read_timeout: 5)
    - SSL<br>
    Thật không may, các tùy chọn SSL đã bị bỏ ở version 2.0. Từ version 2.0.2 đã được thêm vào. Những tùy chọn này sẽ được sử dụng để lấy tài liệu `WSDL` từ xa và yêu cầu SOAP thực thi.
        + ssl_verify_mode<br>
        Bạn có thể vô hiệu hóa xác minh SSL
            Savon.client(ssl_verify_mode: :none)
        + ssl_version<br>
        Bạn có thể khai báo version cho SSL
            Savon.client(ssl_version: :SSLv3)
        + ssl_cert_file<br>
        Có thể set đường dẫn `cert_file` và `cert_key_file`
            Savon.client(ssl_cert_file: "lib/client_cert.pem")
            Savon.client(ssl_cert_key_file: "lib/client_key.pem")
        + ssl_cert_key_password<br>
        Thiết lập mã khoá CERT để giải mã một khóa riêng được mã hóa.
            Savon.client(ssl_cert_key_password: "secret")
    - Request<br>
        + convert_request_keys_to<br>
        Savon thông báo cho Goku để chuyển đổi `messages` SOAP cho khóa của Hash thành các kiểu khác nhau ví dụ: `lowerCamelcase`, `CamelCase`, `UPCASE` hoặc `none`
                client = Savon.client do
                  convert_request_keys_to :camelcase
                end

                client.call(:find_user) do
                  message(user_name: "luke")
                end
        Ví dụ này chuyển đổi tất cả các phím trong yêu cầu Hash để thẻ CamelCase.
            <env:Envelope
              xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:wsdl="http://v1.example.com">
              <env:Body>
                <wsdl:FindUser>
                  <UserName>luke</UserName>
                </wsdl:FindUser>
              </env:Body>
            </env:Envelope>
        + soap_header<br>
        Nếu bạn cần thêm tùy chỉnh XML vào tiêu đề SOAP, bạn có thể sử dụng tùy chọn này. Điều này có thể hữu ích cho việc thiết lập một mã thông báo xác thực toàn cầu hoặc bất kỳ loại khác của siêu dữ liệu.
            Savon.client(soap_header: { "Token" => "secret" })
        Đây là tiêu đề tạo cho các tùy chọn:
            <env:Envelope
                xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
                xmlns:v1="http://v1.example.com/">
              <env:Header>
                <Token>secret</Token>
              </env:Header>
            </env:Envelope>
        + soap_version<br>
        Mặc định là SOAP 1.1. Có thể được thiết lập để SOAP 1.2 để sử dụng một thiết bị đầu cuối SOAP khác nhau.
            Savon.client(soap_version: 2)