4

私は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 => "me@gmail.com", :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>me@gmail.com</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タグの順序が重要かどうかも教えてください。

4

2 に答える 2

9

スティーブのおかげで、ニックとスティーブが同様の問題について話していたところ、「ルビー石鹸の通信にサボンを使用するときに、なぜ「wsdl」名前空間がアクション名に挿入されるのですか? 」を見つけました。

Nickのように、私の問題はSavonがSOAPエンベロープを作成する方法にありました。Nickが推奨するように、私は最終的にSavonSOAPクラスのいくつかのメソッドにモンキーパッチを適用しました。それはlib/savon / soap.rbにあり、私は今行ってもいいです。

私はSOAPに関しては初心者であり、SOAPクライアントを作成するのは初めてですが、正直言ってそれはうまくいきます。初めてRESTサービス用のクライアントを作成したことを今でも覚えていますが、とても楽しかったです。

レストロック、ソープサック。それで全部です!

于 2010-06-29T13:29:57.370 に答える
3

要素がありません<request>

すでに持っている既存のハッシュレコードのsoap.bodyキーと値を持つ単一のハッシュに置き換えてみてください。::request


編集1:

コード内の名前空間行は"https://webservices.sveaekonomi.se/webpay"、現在そこにある完全なURLではないはずです。

于 2010-06-28T16:08:26.997 に答える