2013-05-28 113 views
0

我试图使用httpbuilder发出soap请求。我需要在头部传递一些验证参数。使用http build创建soap请求

我的代码如下

def String WSDL_URL = 'http://ws.tradetracker.com/soap/affiliate?wsdl' 
    def http = new HTTPBuilder(WSDL_URL , ContentType.TEXT) 
    String soapEnvelope = 
       """<?xml version="1.0" encoding="utf-8"?> 
    <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
    <soap-env:Header> 
       <authenticate> 

       <customerID>id</customerID> 
       <passphrase>pass</passphrase> 
       <demo>true</demo> 
       </authenticate> 

    </soap-env:Header> 
     <soap12:Body> 
     <getConversionTransactions xmlns="xmlns':'http://schemas.xmlsoap.org/wsdl"> 
      <affiliateSiteID>id</affiliateSiteID> 


     </getConversionTransactions> 
     </soap12:Body> 
    </soap12:Envelope>""" 
      http.request(Method.POST, ContentType.TEXT) { 
       body = soapEnvelope 

       response.success = { resp, xml -> 
        String xm = xml.readLines() 
        println "XML was ${xm}" 

        def territories = new XmlSlurper().parseText(
         '<?xml version="1.0" encoding="UTF-8"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="urn:http://ws.webgains.com/aws.php" xmlns:enc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><env:Body xmlns:rpc="http://www.w3.org/2003/05/soap-rpc"><ns1:getFullUpdatedEarningsResponse env:encodingStyle="http://www.w3.org/2003/05/soap-encoding"><rpc:result>return</rpc:result><return enc:itemType="ns1:fullLinesArray" enc:arraySize="1" xsi:type="ns1:fullReportArray"><item xsi:type="ns1:fullLinesArray"><transactionID xsi:type="xsd:int">39367137</transactionID><affiliateID xsi:type="xsd:int">59987</affiliateID><campaignName xsi:type="xsd:string">www.tikcode.com</campaignName><campaignID xsi:type="xsd:int">136755</campaignID><date xsi:type="xsd:dateTime">2013-05-13T15:04:48</date><validationDate xsi:type="xsd:dateTime">2013-05-13T15:04:48</validationDate><delayedUntilDate xsi:type="xsd:string"></delayedUntilDate><programName xsi:type="xsd:string">Miniinthebox - US</programName><programID xsi:type="xsd:int">4611</programID><linkID xsi:type="xsd:string">95661</linkID><eventID xsi:type="xsd:int">7285</eventID><commission xsi:type="xsd:float">0.06</commission><saleValue xsi:type="xsd:float">0.8</saleValue><status xsi:type="xsd:string">confirmed</status><paymentStatus xsi:type="xsd:string">notcleared</paymentStatus><changeReason xsi:nil="true"/><clickRef xsi:nil="true"/><clickthroughTime xsi:type="xsd:dateTime">2013-05-13T14:58:33</clickthroughTime><landingPage xsi:type="xsd:string">http%3A%2F%2Fwww.lightinthebox.com%2Fes%2F%3Flitb_from%3Daffiliate_webgains</landingPage><country xsi:type="xsd:string">ES</country><referrer xsi:type="xsd:string">http%3A%2F%2Flocalhost%3A8080%2Fcom.publidirecta.widget%2Fpromocion%2FverPromocion%3Fpromocion%3D</referrer></item></return></ns1:getFullUpdatedEarningsResponse></env:Body></env:Envelope>').declareNamespace("ns1":"http://ws.webgains.com/aws.php") 

       println "aaaaaaaaaaaaaaaa"+ territories.Body.getFullUpdatedEarningsResponse.return.item.transactionID 
       } 

       response.failure = { resp, xml -> 
        println "pues peto, no se porque"+xml.readLines() 
       } 
      } 

即时得到以下错误,我没有任何线索想错

<?xml version="1.0" encoding="UTF-8"?>, <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"><env:Body><env:Fault><env:Code><env:Value>env:Sender</env:Value></env:Code><env:Reason><env:Text>Body must be present in a SOAP envelope</env:Text></env:Reason></env:Fault></env:Body></env:Envelope> 

回答

1

命名空间信封和其对应的Header元素是不匹配的。

<soap12:Envelope>应该有<soap12:Header>而不是你有<soap-env:Header>。有效内容在标题元素中变为无效,因此主体变得无法访问。

+0

事实上这就是问题所在。谢谢你的回答 – user1485182

+0

很高兴我能够提供帮助。您可以接受对访问该问题的其他人有帮助的答案。 – dmahapatro

1

就像@dmahapatro说你在XML中有问题。无论如何检查你的代码我已经注意到你直接使用HTTPBuilder。也许你可以尝试使用groovy-wslite(https://github.com/jwagenleitner/groovy-wslite)来发出SOAP请求。调用和处理响应非常简单。 Grails有一个插件,尽管我没有使用插件,但直接使用groovy-wslite。

BuildConfig.groovy

dependencies { 

    compile 'com.github.groovy-wslite:groovy-wslite:0.7.2' 
    runtime 'com.github.groovy-wslite:groovy-wslite:0.7.2'  
} 

在一个Grails服务,例如:

def cnpj = "999999999906" 
    def clientSOAP = new SOAPClient('https://www.soawebservices.com.br/webservices/producao/cdc/cdc.asmx') 

    def response = clientSOAP.send (SOAPVersion.V1_2, 
     """<?xml version="1.0" encoding="utf-8"?> 
     <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
     <soap12:Body> 
      <PessoaJuridicaNFe xmlns="SOAWebServices"> 
      <Credenciais> 
       <Email>xxxxx</Email> 
       <Senha>xxxxx</Senha> 
      </Credenciais> 
      <Documento>${cnpj}</Documento> 
      </PessoaJuridicaNFe> 
     </soap12:Body> 
     </soap12:Envelope>""" 
    ) 

    //processing the response (very simple...) 
    Client client = new Client() 
    client.webServiceMsg = response.PessoaJuridicaNFeResponse.PessoaJuridicaNFeResult.Mensagem.text() 
    client.nome = response.PessoaJuridicaNFeResponse.PessoaJuridicaNFeResult.RazaoSocial.text() 
    //etc... 
+0

我尝试过使用wslite(实际上,我使用wslite和其他Web服务并且像魅力一样工作)。问题在于,这个特定的WS有0个文档记录,我试图查看WSDL的所有内容都不工作,所以我想看看原始的XML,看看我能不能找出一些东西。 – user1485182