reactjs - 无法获取适用于此 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 错误。
解决方案
在查看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
您是否为、clientCode
和additionalFieldData
元素发送正确的值?我的意思是实际的、可用的值、所有类型的字符串,而不是像${token}
XML 元素这样的占位符而不是字符串值?
您的 SOAP 请求应如下所示(不要忘记添加SOAPAction
HTTP 标头):
<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>
推荐阅读
- .net - ASP.NET MVC 5 中的表单/Windows/Passport 身份验证与身份验证过滤器
- windows - 使用 SVN 命令行的结帐操作
- node.js - 文件完全上传到磁盘时的 Multer 回调
- java - 如何使用硒验证从chrome浏览器下载的excel内容并处理下载的excel文件的受保护视图
- android - Realm Android:isValid()、isLoaded()、isManaged() 是什么意思?
- python - 在 ttk.Treeview 上覆盖删除方法的问题
- jquery - 具有可调整大小和可拖动的元素中的 jquery ui 问题
- javascript - 如何检查是否已过 2 小时?
- c# - C#数组中没有重复项
- r - R根据前列的比较生成值