EDIT: đây là một câu trả lời lỗi thời hẹn hò của đường ray 2.x. Để có câu trả lời hiện tại hơn, tôi khuyên bạn nên xem railscast #290. Tôi để lại câu trả lời này ở đây trong trường hợp ai đó vẫn đang sử dụng đường ray 2.x vì lý do nào đó, và không thể áp dụng những gì Ryan Bates nói ở đó.
Tôi đã chiến đấu với điều này trong một vài ngày và tôi nghĩ mình đã tự tìm được giải pháp.
Đá quý đơn giản, tích cực nhất mà tôi có thể tìm thấy cho tương tác SOAP được gọi là Savon.
Đó là nghĩa vụ phải làm việc với chính Ruby. Đây là chuyến tham quan nhanh về cách bạn sử dụng nó với Rails:
Cài đặt đá quý. Cách đơn giản nhất là để sửa config/môi trường và thêm
config.gem "savon"
Và sau đó chạy
rake gems:install
này nên cài đặt Savon cùng với một vài chi tiết đá quý.
Tiếp theo, tạo ra một lớp trên thư mục app/models/
của bạn (nó không phải là một lớp con của ActiveRecord, chỉ cần một lớp thông thường trên thư mục mô hình của bạn)
Nếu bạn đang như tôi, bạn sẽ muốn ở lại càng xa XML càng tốt. Bạn có thể làm như vậy bằng cách tạo một lớp học như thế này:
class MyWebservice
WSDL = "http://www.theWebSiteWithAService.com/wsdl"
def self.client
@@client ||= Savon::Client.new(WSDL)
end
def self.soap_actions
return client.wsdl.soap_actions
end
def self.invoke(action, parameters)
response = client.send(action) { |soap| soap.body = parameters }
return response.to_hash
end
end
Bạn sẽ chủ yếu sử dụng nó để gọi các phương pháp. Loại phương thức bạn sẽ có thể gọi phụ thuộc vào các dịch vụ mà "trang web khác" cung cấp. Hãy hình dung rằng có 3 hành động có sẵn - :create_monkey
, :destroy_monkey
& :list_monkeys
. Bạn có thể xác nhận rằng danh sách là chính xác bằng cách thực hiện điều này trên bảng điều khiển đường ray:
MyWebservice.soap_actions
=> [:create_monkey, :destroy_monkey, :list_monkeys]
Bây giờ hãy tưởng tượng rằng bạn muốn gọi: create_monkey. Trước tiên, bạn cần biết thông số nào cần cho cuộc gọi đó. Nơi tốt nhất để xem đây là tập tin wsdl. Bạn sẽ thấy một cái gì đó như thế này:
<message name="create_monkey_request">
<part name="name" type="xsd:string"/>
<part name="hair_color" type="xsd:string"/>
</message>
<message name="create_monkey_response">
<part name="status" type="xsd:string"/>
</message>
Vì vậy, phải mất hai tham số: name
và hair_color
.Trên bảng điều khiển ruby, bạn có thể gọi nó như sau:
MyWebService.invoke :create_monkey, {:name => 'frank', :hair_color => 'red' }
=> {:status => 'ok'}
Bạn sẽ nhận được băm như một phản hồi. Trong trường hợp này, tôi có trạng thái 'ok', nhưng nó có thể phức tạp hơn nhiều.
Sau đó, bạn có thể tạo (ví dụ) tableless model được gọi là Monkey
và xác định các phương pháp như new
, create
, v.v ... sử dụng dịch vụ web.
Tôi đang loại bỏ rất nhiều điều thú vị, chẳng hạn như bảo mật. Nhưng điều này sẽ giúp bạn bắt đầu nếu bạn có cùng một vấn đề tôi đã có.
Trân trọng!