【问题标题】:MSXML: XMLHTTP doesn't support charset from headerMSXML:XMLHTTP 不支持来自标头的字符集
【发布时间】:2015-01-11 21:36:01
【问题描述】:

我正在使用从Microsoft XML 类型库生成的MSXML2_TLB.pas 来调用一个非常简单的网络服务,所以我不需要完整的 XML 包装,只需这样做:

var
  r:XMLHTTP;
begin
  r:=CoXMLHTTP.Create;
  r.open('POST',WebServiceURL,false,'','');
  r.setRequestHeader('Content-Type','application/xml');
  r.send('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" '+
    'xmlns:ns="http://somebigcorporation.com/api/ws1/">'+
    '<soapenv:Body>'+
    //snip: irrelevant to the question
    '</soapenv:Body></soapenv:Envelope>');

  if r.status<>200 then raise Exception.Create(r.statusText);
  Result:=(r.responseXML as DOMDocument).documentElement.firstChild.firstChild.selectSingleNode('importantData');
end;

网络服务很好地响应状态 200 和 Content-Type: text/xml; charset=iso-8859-1

在某些情况下,documentElement 为 nil(上面的代码会引发访问冲突)。显然responseXML 存在,但只是为了提供一个parseError 对象(它在the docs 中这么说),而parseError.reason 在这些情况下是An invalid character was found in text content.

为什么解析器没有从响应头中获取“字符集”值?有没有办法告诉 XMLHTTP 实例使用响应头中的字符集值?

更新:我不知道它是否重要,但响应也不是以 &lt;?xml 开头的,即使它确实如此,我也无法请求/修改它,所以它会有一个encoding="iso-8859-1" 属性。

【问题讨论】:

  • 你说响应也不以开头,那么这是否是有效的XML?或者你的意思是序言不包含编码?如果是后者,恐怕你运气不好,为了可靠处理,使用 UTF-8 或 UTF-16 以外的字符编码的 XML 文档必须在 XML 声明中包含编码声明。 (Source)
  • 请将其发布为答案,以便我接受。
  • @StijnSanders,您可以使用r.responseText(根据需要修改它以包含字符集声明)并将其加载到新的 XMLDOC 中,而不是直接使用 responseXML 对象。
  • stackoverflow.com/a/9959386/937125 可能会有所帮助。
  • @kobik:是的,这就是我用来让它工作的(现在)

标签: delphi msxml


【解决方案1】:

我认为您需要在请求中设置字符集,以便结果正确。

r.setRequestHeader('Content-Type', 'application/xml; charset=ISO-8859-1');

【讨论】:

  • 结果正确的。请求也得到了正确处理,我将请求正文编码留给 XMLHTTP 对象。我怀疑设置请求内容类型会影响响应内容类型。问题在于 XMLHTTP 显然误解了响应的编码。
  • @StijnSanders,这不是您问题的核心,但无论如何您应该指定您的请求Content-Type。网络服务可能期待(并处理)这个。例如,如果您指定内容类型为 UTF8 的请求,您可能会惊讶地发现服务器也使用 UTF8 响应。例如,对于 ASMX .net Web 服务,情况就是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 2016-08-30
  • 2012-04-13
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多