2010-06-04 74 views

回答

3

我的答案是:不。

Savon會自動爲您創建一個信封。您可以傳遞任何您想要的頭和身體,例如數組和哈希或XML字符串。您可以操縱現有的(默認)名稱空間,甚至可以覆蓋輸入操作。我不確定爲什麼有人需要在XML解析器(如nokogiri)中構建SOAP信封。

如果您不想使用Savon構建信封的原因是它缺少端點需要的某種功能,請告訴我具體問題是什麼。爲了滿足某些API,我必須對Savon進行相當大量的更改,所以很可能我已經爲您提供了一個補丁。如果沒有,我可以指出你正確的方向,以便你創建自己的補丁。

如果你仍然需要在Savon之外構建一個信封,我建議你根本不要使用Savon,只需通過其中一個很棒的http庫發送XML。

編輯:

爲了說明如何使用SOAP頭(和命名空間),您可以將其以及身體的請求方法:

client = Savon::Client.new "http://url.to/wsdl" 

response = client.get do |soap| 
    # Use merge! for namespaces so that you don't overwrite all of the original namespaces (while still retaining the ability to overwrite individual ones) 
    soap.namespaces.merge!({ 
    "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", 
    "xmlns:xsd" => "http://www.w3.org/2001/XMLSchema" 
    }) 

    # Use soap.header just like you would soap.body 
    soap.header = { 
    # SOAP header hash 
    } 

    # soap.body as usual 
    soap.body = { 
    # SOAP body hash 
    } 
end 
+0

謝謝,我想使用薩翁,但是當我查看文檔時,我不清楚它是否會放入標題。基本上,我只需要使用Savon將肥皂標題以外的任何內容和任何內容放入其中? – Angela 2010-06-04 15:46:48

+0

Angela,它很可能指定SOAP標頭。請參閱我的編輯,看看如何。 – vonconrad 2010-06-07 06:29:01

1

薩翁對待輸入SOAP服務嵌套哈希值。信封由薩翁建造,所以你一般不需要擔心太多,如果有的話。

你是否真的設法連接到服務,如果沒有,你會得到什麼錯誤?

如果你還沒有連接和/或有一些問題,如何做到這一點的概念下面應該讓你開始。

require 'savon' 

client = Savon::Client.new http://api.postalmethods.com/PostalWS.asmx?wsdl 
response = client.UploadFile do |soap| 
    soap.body = { 
    "Username" => "My User", 
    "Password" => "My password" 
    ... 
    } 
end 

如果您在填補空白......這應該讓你開始雖然解析WSDL可能不是前進的生產方式。查看Savon文檔,瞭解您遇到的具體問題。

編輯

如果你不能確定薩翁和SOAP,那麼你可以只使用the postalmethods gem描述here,而不是重新發明輪子

+0

好吧,太棒了 - 這是什麼意思解析wsdl可能不是在生產中前進的方式?我在文檔中看到..... – Angela 2010-06-04 15:48:38

+0

解析wsdl時,您將wsdl傳遞給Savon :: Client的新實例時所執行的操作相當昂貴。一旦你建立了正確的參數通過,你並不需要這麼做。如果我是你,我會像上面這樣工作,看看它是否有效,如果它工作得足夠快,然後做出決定,你是否可以在沒有wsdl的情況下做到這一點。 – 2010-06-04 16:01:49

+0

我明白了 - 那麼如果這樣做,我不會使用這個代碼向前移動......? – Angela 2010-06-06 05:58:19