Delphi MSXML:XMLHTTP不';不支持来自标题的字符集
我正在使用从Delphi MSXML:XMLHTTP不';不支持来自标题的字符集,delphi,msxml,Delphi,Msxml,我正在使用从Microsoft XML类型库生成的MSXML2_TLB.pas调用一个非常简单的web服务,因此我不需要完整的XML包装,只需执行以下操作: var r:XMLHTTP; begin r:=CoXMLHTTP.Create; r.open('POST',WebServiceURL,false,'',''); r.setRequestHeader('Content-Type','application/xml'); r.send('<soapenv:Env
Microsoft XML
类型库生成的MSXML2_TLB.pas
调用一个非常简单的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;
var
r:XMLHTTP;
开始
r:=CoXMLHTTP.Create;
r、 打开('POST',WebServiceURL,false,','');
r、 setRequestHeader('Content-Type','application/xml');
r、 发送(“”)+
''+
//剪:与问题无关
'');
如果为r.status200,则引发异常。创建(r.statusText);
结果:=(r.responseXML作为DOMDocument.documentElement.firstChild.firstChild.selectSingleNode('importantData');
结束;
Web服务响应良好,状态为200,内容类型为text/xml;字符集=iso-8859-1
在某些情况下,documentElement
为nil(并且上面的代码引发访问冲突)。显然,responseXML
存在,但只提供了一个parseError
对象(它在中这样说)和parseError。在这些情况下,原因是在文本内容中发现了无效字符。
为什么解析器不从响应头中获取“charset”值?有没有办法告诉XMLHTTP实例使用响应头中的字符集值
更新:我不知道这是否重要,但是响应也不是以开头的。我认为您需要在请求中设置字符集,以便结果正确
r.setRequestHeader('Content-Type', 'application/xml; charset=ISO-8859-1');
结果是正确的。请求也得到了正确处理,我将请求主体编码留给XMLHTTP对象。我怀疑设置请求内容类型会影响响应内容类型。问题在于XMLHTTP显然误解了响应的编码。@StijnSanders,这不是问题的核心,但在任何情况下,您都应该指定请求内容类型
。web服务可能期望(并处理)这一点。例如,如果您指定了一个内容类型为UTF8的请求,您可能会惊讶地发现服务器响应也是UTF8。例如,ASMX.net web服务就是这样。您说响应也不是以Post作为答案开始的,所以我可以接受它。@StijnSanders,您可以使用r.responseText
(根据您希望包含字符集声明的情况进行修改)并将其加载到新的XMLDOC中,而不是直接使用responseXML
对象。也许会有帮助。@kobik:是的,这就是我用来让它工作的方法(现在)