2013-01-24 31 views
6

Tôi đang sử dụng savon version 2 (với Ruby on Rails) để gọi một dịch vụ web và tôi cần phải thêm một số không gian tên bổ sung vào Phong bì của mình. Một cái gì đó như:Rails - Savon đặt nhiều không gian tên

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:add="http://schemas.xmlsoap.org/ws/2003/03/addressing" 
xmlns:newNamespace1="http://someURL.pt/Test1" 
xmlns:newNamespace2="http://someURL.pt/Test2" 
xmlns:newNamespace3="http://someURL.pt/Test3" 

mã hiện tại của tôi là:

client = Savon.client do 
     wsdl "https://someValidURL?wsdl" 

     namespace "http://someURL.pt/Test1" 
     namespace "http://someURL.pt/Test2" 
     namespace "http://someURL.pt/Test3" 
end 

response = client.call(...the webservice call...) 

... nhưng trong yêu cầu của tôi Savon chỉ đặt không gian tên cuối cùng

<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsns="http://someURL.pt/Test3" 
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> 

tôi không tìm thấy bất kỳ tài liệu về điều này trên Savon Git project.

Có ai có giải pháp cho vấn đề này không ??

PS- Tôi cũng kiểm tra xem một giải pháp có thể là đặt tất cả yêu cầu xml (phong bì) để yêu cầu nhưng ... well ... quá giống với hack.

Nếu đây là không thể và có ngọc tốt khác để làm điều này, xin vui lòng cho tôi biết =)

Trả lời

10

tôi thấy rằng là không thể (bây giờ) để thiết lập nhiều không gian tên trên phiên bản 2 của Savon.

Đối với bây giờ tôi di chuyển ứng dụng của tôi trên Savon phiên bản 1 và nó làm việc =)

begin 
    client = Savon::Client.new do 
     wsdl.document = "https://someURL?wsdl" 
    end 

    @response = client.request :service do 
     soap.namespaces["xmlns:test1"] = "http:/someURLtest1" 
     soap.namespaces["xmlns:test2"] = "http:/someURLtest2" 

     soap.body = { #... the message.... 
      :"test1:something" => {}, 
      :"test2:something1" => {} 
        } 
    end 


    rescue Savon::Error => error 
    log error.to_s 
    end 

Thông tin thêm herehere.

Câu hỏi này sẽ được giải quyết trên phiên bản tiếp theo trên Savon 2 với mã này:

namespaces(
    "xmlns:first" => "http://someURL.pt/Test1", 
    "xmlns:two" => "http://someURL.pt/Testweewqwqeewq" 
) 
1

Kể từ Savon 2.1.0, nó có thể được thực hiện đặt khóa namespaces với một hash của các định nghĩa namespace:

Savon.client({ 
    ... 
    namespaces: { 
    'xmlns:first' => 'http://someURL.pt/Test1', 
    'xmlns:second' => 'http://someURL.pt/Test2', 
    'xmlns:nth' => 'http://someURL.pt/TestN' 
    } 
}) 
Các vấn đề liên quan