2010-01-27 18 views
7

Tôi có ứng dụng Rails thuần túy, hoạt động.Đường ray - Sử dụng giao diện SOAP của một ứng dụng khác

Tôi hiện cần nó để bắt đầu giao tiếp với ứng dụng khác (sympa). Ứng dụng này cho thấy rằng hiển thị một số SOAP interface, do đó, có ý nghĩa là tôi cố gắng sử dụng nó (giao diện dòng lệnh chưa hoàn thành).

Tôi nên làm theo các bước nào?

Tôi nên sử dụng đá quý/plugin nào?

Có ai có hướng dẫn/ví dụ làm việc không?

Tôi ít nhiều quen thuộc với khái niệm SOAP chung, nhưng trước đây tôi chưa bao giờ sử dụng SOAP. Tôi hiểu REST.

Trả lời

11

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ố: namehair_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!

Các vấn đề liên quan