我有一个Windows桌面小工具,对于少数用户而言,几个月前突然停止工作。似乎是他们突然不喜欢跨域请求(即使所有服务器都在我们的Intranet上)。所以,我正在重写这个东西,以便它转到我有很多控制权的单个后端服务器......并且它对后端的Ajax查询被设置为使用数据类型:jsonp。同时,小工具查询Ajax的php脚本调用SOAP服务,获取数据,将其转换为数组,然后使用json_encode将其转换为字符串并在Gadget上添加对回调函数的引用/ javascript方面。
我的问题似乎与json_encode有关。如果SOAP响应包含单个数据记录,则将其作为对象发送。如果SOAP响应包含多个记录,那么就会在它周围敲打括号,就像数组一样。
示例:
单曲:
`{
"SmeDetail": {
"SipAddress": "jane.smith@whatever.com",
"SubjectExpert": "Smith,Jane",
"SubjectMatter": "Unix"
}
}`
多条记录:
`{
"SmeDetail": [
{
"SipAddress": "fred.flintstone@whatever.com",
"SubjectExpert": "Flintstone,Fred",
"SubjectMatter": "Bedrock"
},
{
"SipAddress": "barney.rubble@whatever.com",
"SubjectExpert": "Rubble,Barney",
"SubjectMatter": "Bedrock"
},
{
"SipAddress": "wilma.flintstone@whatever.com",
"SubjectExpert": "Flintsone,Wilma",
"SubjectMatter": "Bedrock"
}
]
}`
在php脚本中,典型的SOAP调用如下:
$Service_URL = 'http://server/PROD/OurWcfService/WcfService.svc?wsdl';
$client = new SoapClient($Service_URL);
$res= $client->GetSMEDetails($params)->GetSMEDetailsResult;
然后$ res被送到这个例程:
$json_data = json_encode((array)$res);
echo $_GET['callback_name'].'('.$json_data.');';
这种回声是作为Ajax响应反馈出来的。
我不确定在哪里读到有关使用这个json_encode((array)$ res)从Soap响应到数组的转换,然后是json编码的字符串。但我想知道我在这里做错了什么?我想我需要确保将单个记录作为数组推送出来。我宁愿修正“正确的方式”,而不是对字符串进行某种破解。
有什么想法吗?
答案 0 :(得分:0)
我认为问题发生的原因是GetSMEDetailsResult返回的不是数组(singlerecord)而是singlerecord本身。
检查" SmeDetail关联"?
提示:How to check if PHP array is associative or sequential?
function isAssoc($arr)
{
return array_keys($arr) !== range(0, count($arr) - 1);
}
if(isAssoc($res['SmeDetail'])) $res['SmeDetail'] = array($res['SmeDetail']);
这个解决方案很难看,但应该可行。 另一种方法是检查"是SipAddress set":
if(isset($res['SmeDetail']['SipAddress'])) $res['SmeDetail'] = array($res['SmeDetail']);