php - PHP - 为 Salesforce API 生成正确的 SOAP 数据
问题描述
谁能帮我指出正确的方向来生成有效的 XML 以与 Salesforce API 一起使用。我通常会像瘟疫一样避免使用 SOAP,但在这里别无选择,而且我似乎处于垂直学习曲线的底部。
我有一个完整的 WSDL,据我所知,它应该涵盖请求的每个部分,包括所有适当的名称空间和复杂类型,但我无法生成与他们的示例匹配的请求。
示例请求的子集如下所示 -
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://soap.sforce.com/schemas/class/WebsiteAPI" xmlns:web1="http://soap.sforce.com/schemas/class/WebsiteAPIUtils">
<soapenv:Header>
<web:SessionHeader>
<web:sessionId> SESSION_ID_FROM_LOGIN_METHOD </web:sessionId>
</web:SessionHeader>
</soapenv:Header>
<soapenv:Body>
<web:upsertLeadOrUpdateAccount>
<web:leadFromWebsite>
<!--Optional:-->
<web1:salesforceId></web1:salesforceId>
...
通过调用相关方法,我可以获得一个带有空元素的<ns1:upsertLeadOrUpdateAccount>
请求(不是相同的命名空间 id,但这并不重要) 。<leadFromWebsite>
但是,我只是无法弄清楚如何<salesforceId>
使用正确的命名空间来获取子元素。我所做的一切要么似乎什么都不做,要么向父级添加“xsi-type”属性,而不是使用命名空间前缀。
我得到的最接近的是以下内容,它将命名空间添加到根元素,但似乎创建了一个看起来很奇怪的xsi-type="ns1:web1"
属性,而不是仅仅在所有元素前面加上web1
.
我确实为 WSDL 中的所有内容提供了 complexTypes,因此我确信 SOAP 库应该有一种方法可以为我处理所有繁重的工作。我真的不想诉诸于手动生成整个批次。
$data = new stdclass();
$data->salesforceId = '123';
$args = [
'leadFromWebsite' => new SoapVar($data, SOAP_ENC_OBJECT, 'web1', 'http://soap.sforce.com/schemas/class/WebsiteAPIUtils')
];
输出 -
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://soap.sforce.com/schemas/class/WebsiteAPIUtils"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="http://soap.sforce.com/schemas/class/WebsiteAPI">
<SOAP-ENV:Header>
<ns2:SessionHeader>
<ns2:sessionId>123</ns2:sessionId>
</ns2:SessionHeader>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns2:upsertLeadOrUpdateAccount>
<ns2:leadFromWebsite xsi:type="ns1:web1">
<salesforceId>123</salesforceId>
</ns2:leadFromWebsite>
</ns2:upsertLeadOrUpdateAccount>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
解决方案
我还没有使用 salesforce API 对此进行全面测试,但我认为我已经设法生成了看起来正确的 XML——至少比我更接近。
似乎我的主要问题是混淆类型和节点名称空间。我想为节点指定命名空间,而不是数据类型。
以下代码生成更接近示例请求的 xml -
$data = [];
$data[] = new SoapVar('123', XSD_STRING, null, null, 'salesforceId', 'http://soap.sforce.com/schemas/class/WebsiteAPIUtils');
$args = [
'leadFromWebsite' => new SoapVar($data, SOAP_ENC_OBJECT, null, null, 'leadFromWebsite', 'http://soap.sforce.com/schemas/class/WebsiteAPI')
];
$s->upsertLeadOrUpdateAccount($args);
XML -
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://soap.sforce.com/schemas/class/WebsiteAPIUtils"
xmlns:ns2="http://soap.sforce.com/schemas/class/WebsiteAPI">
<SOAP-ENV:Header>
<ns2:SessionHeader>
<ns2:sessionId>123</ns2:sessionId>
</ns2:SessionHeader>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns2:upsertLeadOrUpdateAccount>
<ns2:leadFromWebsite>
<ns1:salesforceId>123</ns1:salesforceId>
</ns2:leadFromWebsite>
</ns2:upsertLeadOrUpdateAccount>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
推荐阅读
- css - 如何过渡已经有动画的 React 元素
- c - 如果在 main 中添加了元素,则在 C 中查找链表的元素有效,但如果没有,则无效?
- c# - 在 C# 中指定参数属性的默认值
- ios - 将数据从 tableViewCell 传递到另一个 VC
- javascript - 如何从作为道具传递的数组中反应性地删除一个对象,以便它反映在 DOM 中?
- regex - 正则表达式查找指定的值
- c - 为什么多次调用 calloc 会使我的应用程序崩溃?
- python - Termcolor“彩色”输出奇怪的字符
- javascript - Razor 页面 POST 处理程序未从 jQuery AJAX 接收 JSON 数据
- android - Firebase 数据库的读写调用在 Android 上不起作用