2012-04-08 91 views
1

我已经使用Savon这个代码,我试图去工作。从Savon SOAP请求中删除命名空间

require "savon" 
require "time" 

Gyoku.configure do |config| 
    config.convert_symbols_to(&:tap) 
end 

client = Savon::Client.new("https://www.cfhdocmail.com/TestAPI2/DMWS.asmx?WSDL") 

response = client.request(:CreateMailing) do 
    soap.body = { 
    Username: "Username", 
    Password: "Password", 
    ProductType: "A4Letter", 
    IsMono: false, 
    IsDuplex: true, 
    DespatchASAP: false, 
    DespatchDate: Time.parse("2012-04-09"), 
    AddressNameFormat: "Full Name", 
    ReturnFormat: "JSON" 
    } 
end 

输出看起来像这样

<?xml version="1.0" encoding="UTF-8"?> 
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="https://www.cfhdocmail.com/LiveAutoAPI/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ins0="https://www.cfhdocmail.com/LiveAutoAPI/"> 
    <env:Body> 
     <ins0:CreateMailing> 
      <ins0:Username>Username</ins0:Username> 
      <ins0:Password>Password</ins0:Password> 
      <ins0:ProductType>A4Letter</ins0:ProductType> 
      <ins0:IsMono xsi:nil="true" /> 
      <ins0:IsDuplex>true</ins0:IsDuplex> 
      <ins0:DespatchASAP xsi:nil="true" /> 
      <ins0:DespatchDate>2012-04-09 00:00:00 +0200</ins0:DespatchDate> 
      <ins0:AddressNameFormat>Full Name</ins0:AddressNameFormat> 
      <ins0:ReturnFormat>JSON</ins0:ReturnFormat> 
     </ins0:CreateMailing> 
    </env:Body> 
</env:Envelope> 

但我希望它看起来是这样的。

<?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> 
    <CreateMailing xmlns="https://www.cfhdocmail.com/LiveAutoAPI/"> 
     <Username>Username</Username> 
     <Password>Password</Password> 
     <ProductType>A4Letter</ProductType> 
     <IsMono/>true</IsMono> 
     <IsDuplex>true</IsDuplex> 
     <DespatchASAP>false</DespatchASAP> 
     <DespatchDate>2012-04-09 00:00:00 +0200</DespatchDate> 
     <AddressNameFormat>Full Name</AddressNameFormat> 
     <ReturnFormat>JSON</ReturnFormat> 
    </CreateMailing> 
    </soap:Body> 
</soap:Envelope> 

我该怎么做?

我目前收到此错误

Server did not recognize the value of HTTP Header SOAPAction: CreateMailing. (Savon::SOAP::Fault) 
+1

Does [this](http://stackoverflow.com/a/6969379/89876)回答你的问题? (特别是答案中的“soap.input”部分) – sluukkonen 2012-04-08 23:09:25

回答

1

这些更改解决了我的问题。

client.request(:web, "CreateMailer") do |soap| 
    soap.input = [ 
    "CreateMailer", { 
     xmlns: "https://www.cfhdocmail.com/LiveAutoAPI/" 
    } 
    ] 
    soap.element_form_default = :unqualified 
    soap.body = { 
    Username: "Username", 
    Password: "Password", 
    ProductType: "A4Letter", 
    IsMono: false, 
    IsDuplex: true, 
    DespatchASAP: false, 
    DespatchDate: Time.parse("2012-04-09"), 
    AddressNameFormat: "Full Name", 
    ReturnFormat: "JSON" 
    } 
    client.http.headers.delete("SOAPAction") 
end 

谢谢@sluukkonen寻求帮助。

0

有可能是一个更好的方式来做到这一点,但只有这样,我能想出如何让XML主体究竟我需要怎么样它是建立我自己的XML。我在我的模型中有一个to_xml方法,它被调用,如soap.body = { to_xml }

def to_xml 
    xml = Builder::XmlMarkup.new(indent: 2) 
    xml.instruct! 
    xml.Username "Username" 
    xml.Password "Password" 
end