我正在角度应用程序中进行肥皂调用。
我需要为其中一个调用
传递CDDATA作为有效负载的一部分angular.forEach(contactsCollection, function (item, index) {
contacts = contacts +
'<c>' +
'<f><![CDATA[' + item.FirstName + ']]></f>' +
'<l><![CDATA[' + item.LastName + ']]></l>' +
'<e><![CDATA[' + item.EMailAddress1 + ']]></e>' +
'</c>'
});
soap请求后面的工具是jquery.soap,它与拦截器一起使用。
所有调用都可以正常工作,但有效内容会被删除。
当它传递给肥皂叫时,我可以看到形成是正确的。但是我的有效载荷除了接触位之外每个部分都是正确的:
<Contacts><c><f></f><l></l><e></e></c>....
任何线索?
它肯定是jquery.soap这样做。因为它发生在之前。只是无法弄清楚是什么。 这可能是一些转变的结果吗?
为jquery.soap构建了soap请求:
data: ['<?xml version="1.0" encoding="utf-8"?>' +
'<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:Header>' +
'<ServiceAuthHeader xmlns="http://xxx.cl.xxxxxx.xxxx.xxxx/">' +
'<Username>' + User.Send.Username + '</Username>' +
'<Password>' + User.Send.Password + '</Password>' +
'</ServiceAuthHeader>' +
'</soap:Header>' +
'<soap:Body>' +
'<ContactBulkImportWithGroups xmlns="http://xxx.cl.xxxxxx.xxxx.xxxx/">' +
'<DuplicateAction>Replace</DuplicateAction>' +
'<Groups>' +
'<decimal>' + groupId + '</decimal>' +
'</Groups>' +
'<Contacts>' + contacts + '</Contacts>' +
'<DateFormat>string</DateFormat>' +
'</ContactBulkImportWithGroups>' +
'</soap:Body>' +
'</soap:Envelope>'].join('');
的console.log(触点)
肥皂邮件有效载荷
答案 0 :(得分:3)
问题是jquery.soap不考虑the current code of the jquery.soap.js file中的CDATA
元素,在函数dom2soap
内,从第482行到第488行有代码:
if (child.nodeType === 1) {
var childObject = SOAPTool.dom2soap(child);
soapObject.appendChild(childObject);
}
if (child.nodeType === 3 && !whitespace.test(child.nodeValue)) {
soapObject.val(child.nodeValue);
}
问题是nodeType
元素的CDATA
为4,因此忽略了您的CDATA
元素。
我已经分割了原始的jquery.soap repo,我已经创建了一个名为cdata-fix
的新分支,并且我在jquery.soap.js文件中做了一些更改,应该解决你的问题。 You can see those changes here
我已经在jquery.soap repo中创建了this pull request,希望拉取请求将被接受,但同时随意使用我的jquery.soap.js版本,我&#39 ;我非常有信心它可以正常工作。
在 this Plunker 中,您可以看到我对jquery.soap.js文件所做的更改正在解决您的问题。 (看看有错误的帖子的有效负载)
<强>更新强>
拉取请求has been accepted。
答案 1 :(得分:2)
我是jquery.soap的作者/维护者,我一直在努力让lib更好!也许,因为这与jquery.soap完全相关,你会介意将讨论转移到github吗?您可以在https://github.com/doedje/jquery.soap/找到它并在那里打开一个新问题......
如果您在github上没有帐户,并且不想让我做一个没问题,我们坚持使用stackoverflow ....
我确实看了你描述的问题,但我无法重新创建那个场景。在我的测试平台中,添加到Contacts的命名空间仍然存在并发送到WebService ...
<ContactBulkImportWithGroups xmlns="http://xxx.cl.xxxxxx.xxxx.xxxx/">
<DuplicateAction>Replace</DuplicateAction>
<Groups>
<decimal>01234</decimal>
</Groups>
<Contacts xmlns="http://xxx.c1.xxxxx.xxxx.xxxx/">
<c>
<f><![CDATA[Remy]]></f>
<l><![CDATA[Blom]]></l>
<e><![CDATA[remy.blom@hku.nl]]></e>
</c>
</Contacts>
<DateFormat>string</DateFormat>
</ContactBulkImportWithGroups>
这正是xml进入的方式,并且来自我的测试平台中的jquery.soap。也许你能给我一个出错的例子吗?
更新:我现在看到你正在尝试发送一个空命名空间...... xmlns =“” 这确实需要您在帖子中进行的更改。我把它放在我的代码中并将它们发布给tommorow ......
答案 2 :(得分:0)
不是我自己的问题的答案,而是重要的见解。
我想我还要提一下插件的分配属性的方法:
某些API需要空命名空间,并且该工具不允许那些破坏请求的人。
例如,如果我想发布<contacts xmlns="">....
,则插件会将其转为<contacts>....
解决方法是:
this.attr = function (name, value) {
if (!!name && !!value || !!name && value === "") {
this.attributes[name] = value;
return this;
} else if (!!name) {
return this.attributes[name];
} else {
return this.attributes;
}
};