2012-02-29 20 views
5

Sto tentando di utilizzare un servizio Web utilizzando Delphi 2010 e Indy. Per stabilire uno stream SOAP utilizzabile da confrontare con quello creato dal mio programma, sto testando in SOAPUI. Sto utilizzando un flusso SOAP fornito dal provider di servizi Web che corrisponde anche al flusso SOAP specificato nel file WSDL. Ricevo un errore HTTP 400 (richiesta errata) dal servizio.Richiesta non valida in SOAPUI

Da quello che posso trovare online, sembra che ricevere un errore HTTP 400 indica che la tua richiesta SOAP è malformata e non può essere letta dal servizio web. Ho testato il mio flusso SOAP utilizzando XMLPad e l'XML sembra essere ben formato. Suppongo che ciò possa significare che qualcosa non corrisponde ai suoi requisiti di schema. Per prima cosa controllerò la descrizione dello schema per la password nel caso in cui ci si aspetti che non venga inviata come testo normale. Che altro dovrei controllare per eliminare un errore HTTP 400?

Ecco la mia richiesta (meno username e password) in caso aiuta:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" 
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
xmlns:xop="http://www.w3.org/2004/08/xop/include" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://wwww3.org/2001/XMLSchema-instance"> 
    <soap:Header> 
     <wsa:Action>http://edd.ca.gov/SendTransmission</wsa:Action> 
     <wsa:MessageID>urn:uuid:5aa788dc-86e1-448b-b085-2d2743cf9f26</wsa:MessageID> 
     <wsa:ReplyTo> 
     <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address> 
     </wsa:ReplyTo> 
     <wsa:To>http://fsettestversion.edd.ca.gov/fsetproxy/fsetservice.asmx</wsa:To> 
     <wsse:Security soap:mustUnderstand="1"> 
     <wsse:UsernameToken wsu:Id="UsernameToken"> 
      <wsse:Username>#USERNAME#</wsse:Username> 
      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">#PASSWORD#/wsse:Password> 
      <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">O5QWht1bslLCX6KnlEypAA==</wsse:Nonce> 
      <wsu:Created>2012-02-29T22:32:38.250Z</wsu:Created> 
     </wsse:UsernameToken> 
     <wsu:Timestamp wsu:Id="Timestamp-805a7373-335c-43b6-ba21-6596c4848dbf"> 
      <wsu:Created>2012-02-22T15:41:42Z</wsu:Created> 
      <wsu:Expires>2012-02-22T15:46:42Z</wsu:Expires> 
     </wsu:Timestamp> 
     </wsse:Security> 
    </soap:Header> 
    <soap:Body> 
     <SendTransmission xmlns="http://edd.ca.gov/"> 
     <SendTransmissionRequest xmlns="http://www.irs.gov/a2a/mef/MeFTransmitterServiceWse.xsd"> 
      <TransmissionDataList> 
       <Count>1</Count> 
       <TransmissionData> 
        <TransmissionId>123456789</TransmissionId> 
        <ElectronicPostmark>2012-02-22T07:41:42.2502206-08:00</ElectronicPostmark> 
       </TransmissionData> 
      </TransmissionDataList> 
     </SendTransmissionRequest> 
     <fileBytes> 
      <xop:Include href="cid:[email protected]"/> 
     </fileBytes> 
     </SendTransmission> 
    </soap:Body> 
</soap:Envelope> 

risposta

2

Ci può essere qualcosa di diverso, ma al momento, io sono sospettoso del wsse: UsernameToken. Ho scaricato il documento allo http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdf e l'ho letto la scorsa notte. È scritto in un linguaggio abbastanza semplice e sento di capire quello che sta dicendo, ma mi lascia una domanda più piccola di quella che ho chiesto in origine. Questo documento propone che è possibile utilizzare una password di testo normale in questo formato:

<S11:Envelope xmlns:S11="..." xmlns:wsse="..."> 
    <S11:Header> 
    ... 
    <wsse:Security> 
     <wsse:UsernameToken> 
     <wsse:Username>Zoe</wsse:Username> 
     <wsse:Password>IloveDogs</wsse:Password> 
     </wsse:UsernameToken> 
    </wsse:Security> 
    ... 
    </S11:Header> 
... 
</S11:Envelope> 

Oppure si può utilizzare una password digest. Esso definisce una password digerire come questo:

Password_Digest = Base64 (SHA-1 (nonce + creato + password))

Secondo il riferimento, il formato di una password digest sarebbe simile a questa :

<S11:Envelope xmlns:S11="..." xmlns:wsse="..." xmlns:wsu= "..."> 
    <S11:Header> 
    ... 
    <wsse:Security> 
    <wsse:UsernameToken> 
     <wsse:Username>NNK</wsse:Username> 
     <wsse:Password Type="...#PasswordDigest"> 
     weYI3nXd8LjMNVksCKFV8t3rgHh3Rw== 
     </wsse:Password> 
     <wsse:Nonce>WScqanjCEAC4mQoBE07sAQ==</wsse:Nonce> 
     <wsu:Created>2003-07-16T01:24:32Z</wsu:Created> 
    </wsse:UsernameToken> 
    </wsse:Security> 
    ... 
    </S11:Header> 
... 
</S11:Envelope> 

Questo non è il formato utilizzato nell'esempio fornita dalla casa editrice servizio web. La versione in testo normale nel riferimento non usa un nonce. Il messaggio di esempio utilizza un nonce ma richiede una password di testo normale. Mi sembra che l'uso di un nonce senza un digest di password non aggiunga alcuna sicurezza al messaggio. Potrebbe essere una qualsiasi stringa casuale di caratteri se non c'è un accordo su come deve essere creato. Mi manca il punto?

So che questo deve sembrare un'impresa noiosa, ma spero che, fornendo questo qui, forse possiamo fornire un piccolo aiuto alla prossima persona che arriva.

0

Anch'io ho riscontrato questo problema. L'editore del servizio web (edd.ca.gov) ha risposto affermando che il "valore è richiesto dagli standard SOAP 1.2" ma non trovo alcun valido supporto per questo. Sembra che entrambi stiamo procedendo nello stesso percorso (FSET) e forse dovremmo collaborare e lavorare insieme, due teste sono meglio di una. Ho trovato molti errori nel codice di esempio e anch'io sono riuscito a farlo funzionare.

+1

Sembra che le persone che sono prontamente disponibili a EDD non saranno di grande aiuto. Ho messo da parte questo progetto per un po 'in modo da concentrarmi su altre cose. Dovrò tornare indietro ma non ho ancora messo da parte il tempo. Sarei più che disposto a combinare gli sforzi. Non vedo che SO abbia una funzione di messaggio privato, ma se sei seriamente intenzionato a collaborare, commenta nuovamente e scopriremo un modo per comunicare offline. – jrodenhi

+0

Potrei pubblicare la mia e-mail se questo non "infrange le regole" –

+0

In realtà, il mio indirizzo e-mail è nel mio profilo. Penso che l'unico problema con la pubblicazione del tuo indirizzo e-mail sia che potrebbe portare a un sacco di spam.Non penso che non pubblicare il tuo indirizzo email porti a non ottenere un sacco di spam ma chi sono io per dire. – jrodenhi

Problemi correlati