【问题标题】:Bad Request in SOAPUISOAPUI 中的错误请求
【发布时间】:2012-03-19 11:40:27
【问题描述】:

我正在尝试使用 Delphi 2010 和 Indy 使用 Web 服务。为了建立一个可用的 SOAP 流来与我的程序创建的流进行比较,我正在 SOAPUI 中进行测试。我正在使用 Web 服务提供商提供的 SOAP 流,它也与 WSDL 文件中指定的 SOAP 流相匹配。我收到来自服务的 HTTP 400(错误请求)错误。

根据我在网上找到的信息,收到 HTTP 400 错误似乎表明您的 SOAP 请求格式不正确,无法被 Web 服务读取。我已经使用XMLPad 测试了我的 SOAP 流,并且 XML 似乎格式正确。我想这可能意味着某些东西不符合其架构要求。我将首先检查密码的架构描述,以防它不会以纯文本形式发送。为了消除 HTTP 400 错误,我还应该检查什么?

这是我的请求(少用户名和密码)以防万一:

<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:1.634654933022658454@example.org"/>
         </fileBytes>
      </SendTransmission>
   </soap:Body>
</soap:Envelope>

【问题讨论】:

    标签: delphi soap delphi-2010 indy


    【解决方案1】:

    我也遇到过这个问题。 Web 服务发布者 (edd.ca.gov) 回应说“值是 SOAP 1.2 标准所要求的”,但我找不到对此的有效支持。看起来我们俩都走在同一条路上(FSET),也许我们应该合作并一起工作,两个头总比一个好。我在示例代码中发现了很多错误,我也没有让它工作。

    【讨论】:

    • 看来,EDD 随时可用的人不会有太大帮助。我把这个项目搁置了一段时间,以便我可以专注于其他一些事情。我将不得不回到它,但我还没有留出时间。我非常愿意共同努力。我没看到SO有私信功能,但是如果你认真合作的话,再评论一下,我们会想办法线下交流的。
    • 如果不“违反规则”,我可以发布我的电子邮件
    • 实际上,我的电子邮件地址在我的个人资料中。我认为发布您的电子邮件地址的唯一问题是它可能会导致您收到一堆垃圾邮件。我不认为不发布您的电子邮件地址会导致不会收到一堆垃圾邮件,但我该说谁。
    • 我查看了您的电子邮件,但没有电子邮件,但我的个人资料确实显示了一封。我马上就要离开办公室回家了。我会在太平洋时间 8:30 回到办公室。
    【解决方案2】:

    可能还有其他东西,但目前,我对 wsse:UsernameToken 持怀疑态度。我在http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdf 下载了文档并在昨晚阅读了它。它是用相当简单的语言写的,我觉得我明白它在说什么,但它给我留下的问题比我最初提出的问题要小。本文档建议您可以使用这种格式的纯文本密码:

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

    或者您可以使用密码摘要。它定义了一个这样的密码摘要:

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

    根据参考资料,密码摘要的格式如下所示:

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

    这不是 Web 服务发布者提供的示例中使用的格式。参考中的纯文本版本不使用随机数。示例消息使用随机数,但需要纯文本密码。在我看来,使用没有密码摘要的随机数不会为消息增加任何安全性。如果没有就如何创建它达成一致意见,它可以是任何随机字符串。我没有抓住重点吗?

    我知道这似乎是一项乏味的工作,但我希望通过在这里提供这个,也许我们可以为下一个人提供一点帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多