2010-06-28 152 views
3
SOAP服务谈

我试图用肥皂服务进行沟通,我知道我应该发送SOAP信封是这样的:用萨翁宝石红宝石

POST /webpay_test/SveaWebPay.asmx HTTP/1.1 
Host: webservices.sveaekonomi.se 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "https://webservices.sveaekonomi.se/webpay/CreateOrder" 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <CreateOrder xmlns="https://webservices.sveaekonomi.se/webpay"> 
     <request> 
     <Order> 
      <ClientOrderNr>string</ClientOrderNr> 
      <CustomerReference>string</CustomerReference> 
      <OrderDate>dateTime</OrderDate> 
      <CountryCode>string</CountryCode> 
      <SecurityNumber>string</SecurityNumber> 
      <CustomerEmail>string</CustomerEmail> 
      <IsCompany>boolean</IsCompany> 
      <PreApprovedCustomerId>long</PreApprovedCustomerId> 
      <AddressSelector>string</AddressSelector> 
     </Order> 
     <InvoiceRows> 
      <ClientInvoiceRowInfo> 
      <ArticleNr>string</ArticleNr> 
      <Description>string</Description> 
      <PricePerUnit>double</PricePerUnit> 
      <NrOfUnits>double</NrOfUnits> 
      <Unit>string</Unit> 
      <VatPercent>int</VatPercent> 
      <DiscountPercent>int</DiscountPercent> 
      <ClientOrderRowNr>int</ClientOrderRowNr> 
      </ClientInvoiceRowInfo> 
      <ClientInvoiceRowInfo> 
      <ArticleNr>string</ArticleNr> 
      <Description>string</Description> 
      <PricePerUnit>double</PricePerUnit> 
      <NrOfUnits>double</NrOfUnits> 
      <Unit>string</Unit> 
      <VatPercent>int</VatPercent> 
      <DiscountPercent>int</DiscountPercent> 
      <ClientOrderRowNr>int</ClientOrderRowNr> 
      </ClientInvoiceRowInfo> 
     </InvoiceRows> 
     </request> 
    </CreateOrder> 
    </soap:Body> 
</soap:Envelope> 

这里是我的代码写道:

client = Savon::Client.new("https://webservices.sveaekonomi.se/webpay_test/SveaWebPay.asmx?wsdl") 
res = client.create_order do |soap| 
    soap.namespace = "https://webservices.sveaekonomi.se/webpay_test/CreateOrder.asmx" 
    soap.body = { :auth   => { :username => "username", :password => "pass", :client_number => "1111" }, 
        :order  => { :client_order_nr => "1000000", :customer_reference => "4212", :order_date => Date.today, 
             :country_code => "SE", :security_number => "1111111111", :is_company => false, 
             :customer_email => "[email protected]", :pre_approved_customer_id => 0 }, 
        :invoice_rows => { :client_invoice_row_info => { :article_nr => "x100", :description => "something cool -- description", 
             :price_per_unit => 100, :nr_of_units => 3, :unit => "SEK", :vat_percent => 25, 
             :discount_percent => 0, :client_order_row_nr => "1"}, 
            :client_invoice_row_info => { :article_nr => "x200", :description => "something cooler -- description", 
             :price_per_unit => 200, :nr_of_units => 2, :unit => "SEK", :vat_percent => 25, 
             :discount_percent => 0, :client_order_row_nr => "1" } 
            } 
    } 
end 

,并产生这一点,这是我得从什么作为模板,这就是为什么我得到一个错误不同:

<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:wsdl="https://webservices.sveaekonomi.se/webpay_test/CreateOrder.asmx" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> 
<env:Body> 
<wsdl:CreateOrder> 
<invoiceRows> 
    <clientInvoiceRowInfo> 
    <clientOrderRowNr>1</clientOrderRowNr> 
    <pricePerUnit>200</pricePerUnit> 
    <nrOfUnits>2</nrOfUnits> 
    <unit>SEK</unit> 
    <vatPercent>25</vatPercent> 
    <articleNr>x200</articleNr> 
    <discountPercent>0</discountPercent> 
    <description>something cooler -- description</description> 
    </clientInvoiceRowInfo> 
</invoiceRows> 
<order> 
    <customerEmail>[email protected]</customerEmail> 
    <preApprovedCustomerId>0</preApprovedCustomerId> 
    <countryCode>SE</countryCode> 
    <clientOrderNr>1000000</clientOrderNr> 
    <securityNumber>11111111</securityNumber> 
    <customerReference>4212</customerReference> 
    <isCompany>false</isCompany> 
    <orderDate>2010-06-28</orderDate> 
</order> 
<auth> 
    <password>pass</password> 
    <clientNumber>1111</clientNumber> 
    <username>username</username> 
</auth> 
</wsdl:CreateOrder> 
</env:Body> 
</env:Envelope> 

这里是响应:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <CreateOrderResponse xmlns="https://webservices.sveaekonomi.se/webpay"> 
     <CreateOrderResult> 
     <Accepted>false</Accepted> 
     <ErrorMessage>Failed to create or authorize order</ErrorMessage> 
     <SveaOrderNr>0</SveaOrderNr> 
     <RejectionCode>Error</RejectionCode> 
     <WillBuyInvoices xsi:nil="true" /> 
     <AuthorizeId>0</AuthorizeId> 
     <AuthorizedAmount xsi:nil="true" /> 
     <ExpirationDate xsi:nil="true" /> 
     </CreateOrderResult> 
    </CreateOrderResponse> 
    </soap:Body> 
</soap:Envelope> 

任何人都可以告诉我,我怎么能解决这个问题。因为我是SOAP的新手,你还会告诉我soap:Body标签中XML标签的顺序是否重要?

回答

8

感谢史蒂夫,我发现“Why is “wsdl” namespace interjected into action name when using savon for ruby soap communication?”尼克和史蒂夫在谈论类似的问题。

像尼克一样,我的问题在于萨翁正在烹饪SOAP信封的方式。正如Nick所推荐的,我最终在Savon SOAP类中为猴子修补了几个方法。它在lib/savon/soap.rb ,我现在很好。

对于SOAP而言,我是新手,这是我第一次编写SOAP客户端,但老实说它是成功的!我还记得我第一次为REST服务编写客户端,而且很有趣。

REST ROCKS,SOAP SUCKS。就这样!

+2

upvoted for“but honestly it SUCKS!”, 尽管我没有找到我正在寻找的答案;) – 2012-05-01 13:01:13

3

您缺少<request>元素。

尝试用一个密钥::request的单个散列替换您的soap.body以及您已有的现有散列记录的值。


编辑1:

代码中你的命名空间线应"https://webservices.sveaekonomi.se/webpay"并非完整的网址你那里现在。

+0

谢谢你提到的。我添加了请求标记,但仍然出现错误。有一点是savon生成env标签,而它应该是肥皂标签。尽管两者都共享相同的xmlns属性?它可能是问题的根源吗? 另一件事是在CreateOrder标签上。规范要求像,而savon生成一些像这样的 2010-06-29 10:21:21

+0

编辑了另一个可能的问题。 – 2010-06-29 11:31:48