如何使用带有xml的angular+8的soap asmx服务

Posted

技术标签:

【中文标题】如何使用带有xml的angular+8的soap asmx服务【英文标题】:How to consume a soap asmx service from angular+8 with xml on it 【发布时间】:2021-06-16 03:21:42 【问题描述】:

这是我的电话:

  var xmlItemAll =
      '<?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:Body>' +
      '<GetDynamicData xmlns="http://tempuri.org/">' +
      '<DynQueryID>FILE_ITEMS</DynQueryID>' +
      '<CriteriaName>USN</CriteriaName>' +
      '<CriteriaValue>50101497</CriteriaValue>' +
      '</GetDynamicData>' +
      '</soap:Body>' +
      '</soap:Envelope>';

    let headers = new HttpHeaders(
      'Content-Type': 'application/xml',
    );

    const hdr =  headers: headers, body: xmlItemAll ;

    this.http.post('http://someURL:somePORT/FWebService.asmx?op=GetDynamicData', hdr)
      .toPromise()
      .then((result) => 
           console.log(result)
       

我收到此错误:

肥皂:ReceiverServer 无法处理请求。 ---> 根级别的数据无效。第 1 行,位置 1。

我做错了什么?

【问题讨论】:

【参考方案1】:

问题很可能是这一行:

<?xml version="1.0" encoding="utf-8"?>

服务不喜欢该行并希望消息直接以 SOAP 信封开头,或者该行的第一个字符是不可打印的字符,例如 UTF-8 byte order mark (BOM)。您是否偶然从文件中复制了 SOAP XML?如果是这样,您可能已经选择了它的 BOM。

删除该行或删除并重写其第一个字符以尝试摆脱 BOM,然后再次调用。如果您将内容类型更改为以下内容,则不一定需要该行,以便服务器知道它是 UTF-8:

Content-Type: text/xml; charset="utf-8"

另外,使用text/xml 而不是application/xml

我要补充的另外两件事是:

从端点中删除?op=GetDynamicData 参数只是为了保持清晰。这通常是测试和获取有关 GET 操作的详细信息所需要的,而不是调用 POST 服务所必需的。 您可能还需要以SOAP action 的形式添加另一个HTTP 标头,例如SOAPAction: "Some-Value",否则您的服务可能会抱怨它。您添加的值必须与您正在调用的操作相匹配。

【讨论】:

好的。我尝试这个没有运气: 1.- 删除该行并将其写下来... 2. 删除它,将它放在header as: 'Content-Type': 'text/xml, charset="utf-8"' 3. 还要更改 text/xml 部分 4. 删除 ?op=GetDynamicData 并将其放在 header 中并最终为:let headers = new HttpHeaders( 'Content-Type': 'text/xml, charset="utf-8"', SOAPAction: 'op=GetDynamicData', );仍然有我提到的相同错误 也忘了提到我在邮递员中尝试了相同的代码,它就像一个魅力。但我不知道我是否忘记了角度请求中的某些内容。邮递员上有一个参数,您将此 xml 设置为“原始”和“XML”模式...不知道是否包含在 http.post 查看浏览器调试工具中的网络选项卡,查看请求是如何产生的。可能请求正文有问题。 仔细看你的通话,请求内容是用body还是data设置的?喜欢data: xmlItemAll 我审核了请求,似乎没问题。我复制了一些代码并放置了数据部分,不知道是数据还是正文。我已经改变了它,但仍然没有运气【参考方案2】:

也许这只是一个引用类型的问题。使用 ` 而不是 ' 或转义简单引号内的双引号,如下所示: &lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;

【讨论】:

好吧,实际上我尝试了 ` 和 ' 和 " .... 以及所有单行,最后是 + 版本。但感谢您指出这一点。:)

以上是关于如何使用带有xml的angular+8的soap asmx服务的主要内容,如果未能解决你的问题,请参考以下文章

如何设置soap请求对象为 application/soap+xml;charset=utf-8

无法使用 DOM 解析器读取带有命名空间前缀的 xml

php解析带有命名空间的xml

无法处理消息,因为内容类型 'text/xml;charset=UTF-8' 不是预期的类型 'application/soap+xml;字符集=utf-8'

无法处理消息,因为内容类型为 'text/xml; charset=utf-8' 不是预期的类型 'application/soap+xml;字符集=utf-8'

如何在Angular 8中从http客户端传递带有查询对象的数组