首页 > 解决方案 > 无法获取适用于此 XML Soap 请求的语法 - 400 错误

问题描述

在 React JS 中使用 SOAP API,一切都很好,除了这个函数不断返回 400 错误。

使用 Axios 使用以下语法发出 POST 请求。

目标是获取特定的客户端 ID 并能够编辑指定的字段。

let getExtraInfo = `<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>
    <UpdateClientAdditionalFields xmlns="http://www.ozsoft.com.au/VETtrak/api/complete">
      <token>${token}</token>
      <clientCode>09224</clientCode>
      <additionalFieldData>
        <AdditionalData>
          <Gender>M</Gender>
        </AdditionalData>
      </additionalFieldData>
    </UpdateClientAdditionalFields>
  </soap:Body>
</soap:Envelope>`

这是API的链接

https://sthservices.ozsoft.com.au/SIU_API/VT_API.asmx?op=UpdateClientAdditionalFields

我已经尝试了每种组合以使请求正常工作,但我认为问题可能是 API 端的语法不正确。

这里是我使用 Axios 调用的 API 供参考。

async function GetTimetableData(xmlsChosen){
     const response = await axios.post('https://thingproxy.freeboard.io/fetch/https://sthservices.ozsoft.com.au/SIU_API/VT_API.asmx?wsdl',
      xmlsChosen,
      { 
          headers:{ 
                    'Content-Type': 'text/xml'}
      }).then(res=>{
        var jsonObj = parse(res.data);
       // setCourseChosen(jsonObj.["soap:Envelope"]["soap:Body"].GetOccurrenceExtendedDetailsResponse.GetOccurrenceExtendedDetailsResult.OccuExtended);     
          console.log(jsonObj);
      }).catch(err=>{console.log(err);
      }).finally(() => {
        
      });  
  }      

谁能提供一些关于如何使用 React JS 执行此请求的见解。我已经直接询问了开发人员,但他们的回答是用 PHP 编写的,对这个特定问题没有帮助。

其他字段的列表也可以在这里找到。

https://customer.vettrak.com.au/hc/en-us/articles/360002285835

如果需要,我可以提供更多信息。

更新

我已经添加了标头并检查了令牌是否正确 - 我也没有使用具有其他功能的令牌发出其他请求的问题。

我试过下面的语法。

`<soap:Envelope 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:com="http://www.ozsoft.com.au/VETtrak/api/complete">
<soap:Body>
  <com:UpdateClientAdditionalFields>
     <com:token>676767676</com:token>
     <com:clientCode>09224</com:clientCode>
     <com:additionalFieldData>"<com:AdditionalData><com:Gender>M></com:Gender></com:AdditionalData>"</com:additionalFieldData>
  </com:UpdateClientAdditionalFields>
</soap:Body>
</soap:Envelope>`
`<soap:Envelope 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:com="http://www.ozsoft.com.au/VETtrak/api/complete">
<soap:Body>
  <com:UpdateClientAdditionalFields>
     <com:token>${token}</com:token>
     <com:clientCode>09224</com:clientCode>
     <com:additionalFieldData><AdditionalData><Gender>M><Gender><AdditionalData></com:additionalFieldData>
  </com:UpdateClientAdditionalFields>
</soap:Body>
</soap:Envelope>`

如果我执行以下请求

`<soap:Envelope 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:com="http://www.ozsoft.com.au/VETtrak/api/complete">
<soap:Body>
  <com:UpdateClientAdditionalFields>
     <com:token>${token}</com:token>
     <com:clientCode>09224</com:clientCode>
     <com:additionalFieldData><com:AdditionalData>string</com:AdditionalData></com:additionalFieldData>
  </com:UpdateClientAdditionalFields>
</soap:Body>
</soap:Envelope>`

我收到“解析附加数据 XML 时出现问题:根级别的数据无效。第 1 行,位置 1。” 错误。我知道令牌和客户端代码很好,因为当我不包含它们时,我得到一个身份验证错误/客户端不存在响应。

然后当我这样做时:

`<soap:Envelope 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:com="http://www.ozsoft.com.au/VETtrak/api/complete">
<soap:Body>
  <com:UpdateClientAdditionalFields>
     <com:token>${token}</com:token>
     <com:clientCode>09224</com:clientCode>
     <com:additionalFieldData><com:AdditionalData><gender>M</gender><com:/AdditionalData></com:additionalFieldData>
  </com:UpdateClientAdditionalFields>
</soap:Body>
</soap:Envelope>`

我收到通常的 400 错误。

标签: reactjsxmlapisoapsyntax

解决方案


在查看UpdateClientAdditionalFields了 WSDL 内部之后,您的某个参数似乎是错误的。顶部元素定义为:

  <s:element name="UpdateClientAdditionalFields">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="token" type="s:string"/>
        <s:element minOccurs="0" maxOccurs="1" name="clientCode" type="s:string"/>
        <s:element minOccurs="0" maxOccurs="1" name="additionalFieldData" type="s:string"/>
      </s:sequence>
    </s:complexType>
  </s:element>

additionalFieldData是一个字符串,但您在消息中发送了一个 XML:

  <additionalFieldData>
    <AdditionalData>
      <Gender>M</Gender>
    </AdditionalData>
  </additionalFieldData>

尝试使用字符串或不使用此字段以查看它是否有效(因为它是可选的minOccurs="0")。

此外,您的令牌可能是错误的:

<token>${token}</token>

这是您需要在调用之前替换的变量吗?

还添加一个名为SOAPAction的 HTTP 标头,如下所示:

SOAPAction: "http://www.ozsoft.com.au/VETtrak/api/complete/UpdateClientAdditionalFields"

重试这些更改,看看它是否有效。

根据评论编辑:

token您是否为、clientCodeadditionalFieldData元素发送正确的值?我的意思是实际的、可用的值、所有类型的字符串,而不是像${token}XML 元素这样的占位符而不是字符串值?

您的 SOAP 请求应如下所示(不要忘记添加SOAPActionHTTP 标头):

<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:com="http://www.ozsoft.com.au/VETtrak/api/complete">
   <soap:Body>
      <com:UpdateClientAdditionalFields>
         <com:token>proper value here</com:token>
         <com:clientCode>proper value here</com:clientCode>
         <com:additionalFieldData>proper value here</com:additionalFieldData>
      </com:UpdateClientAdditionalFields>
   </soap:Body>
</soap:Envelope>

推荐阅读