2010-06-28 14 views
3

Je suis en train de communiquer avec un service de savon et je sais que je devrais envoyer une enveloppe SOAP comme ceci:Parler avec un service SOAP en utilisant gem Savon en Ruby

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> 

est le code ici, je l'ai a écrit:

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 

et génère ce qui est différent de ce que j'ai comme modèle et c'est la raison pour laquelle je reçois une erreur:

<?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> 

et voici la réponse:

<?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> 

Quelqu'un pourrait-il me dire comment puis-je résoudre ce problème. et puisque je suis un novice en ce qui concerne SOAP, pourriez-vous me dire si l'ordre des balises xml dans la balise soap: Body est important ou non?

Répondre

8

Grâce à Steve, j'ai trouvé "Why is “wsdl” namespace interjected into action name when using savon for ruby soap communication?" où Nick et Steve parlaient d'un problème similaire. Comme Nick, mon problème était dans la façon dont Savon prépare une enveloppe SOAP. Comme recommandé par Nick, j'ai fini par appliquer quelques méthodes à la classe Savon SOAP. C'est dans lib/savon/soap.rb et je vais bien y aller maintenant.

Je suis novice quand il s'agit de SOAP et c'est la première fois que j'écris un client SOAP, mais honnêtement ça SUCE! Je me souviens encore de ma première fois en écrivant un client pour un service REST et ça alors c'était amusant.

ROCHES DE REPOS, SUCKS DE SAVON. c'est tout!

+2

upvoted pour "mais honnêtement il SUCE!", même si je n'ai pas trouvé la réponse que je cherche;) –

3

Il vous manque l'élément <request>.

Essayez de remplacer votre soap.body par un seul hachage avec une clé de ::request et une valeur de l'enregistrement de hachage existant que vous avez déjà.


EDIT 1:

Votre ligne d'espace de noms dans votre code doit être "https://webservices.sveaekonomi.se/webpay" pas l'URL complète que vous avez là actuellement.

+0

Merci d'avoir mentionné cela. J'ai ajouté la balise de demande, mais j'ai toujours l'erreur. une chose est que le savon génère des étiquettes d'env. alors que ce devrait être des étiquettes de savon. bien que les deux partagent le même attribut xmlns? pourrait-il être la source du problème? l'autre chose est sur la balise CreateOrder. la spécification a demandé quelque chose comme alors que le savon en génère comme ceci

+0

Édité avec un autre problème possible. –