我正在使用从MSXML2_TLB.pas
类型库生成的Microsoft XML
来调用一个非常简单的Web服务,因此我不需要完整的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;
Web服务以状态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.
。为什么解析器不从响应头中获取'charset'值?有没有办法告诉XMLHTTP实例使用响应头中的字符集值?
更新:我不知道它是否重要,但是响应也不以
<?xml
开头,即使响应也没有办法请求/修改,所以它将具有encoding="iso-8859-1"
属性。 最佳答案
我认为您需要在请求中设置字符集,以便结果正确。
r.setRequestHeader('Content-Type', 'application/xml; charset=ISO-8859-1');
关于delphi - MSXML:XMLHTTP不支持 header 中的字符集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26930932/