CDATA在发送之前被删除

时间:2014-09-12 13:44:50

标签: javascript ajax angularjs soap

我正在角度应用程序中进行肥皂调用。

我需要为其中一个调用

传递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(触点)

console.log(contacts)

肥皂邮件有效载荷

payload

3 个答案:

答案 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;
    }
};