procedure Texport_plan.cxB_LoadClick(Sender: TObject);
var
HTTP: TIdHTTP;
Query: String;
Buffer: TMemoryStream;
loadData: Sting;
responseData: String;
begin
try
HTTP := TIdHTTP.Create(nil);
HTTP.Request.ContentEncoding := 'utf-8';
HTTP.Request.ContentType := 'text/xml';
Application.ProcessMessages;
Query := 'http://priem.edu.ru:8000/import/ImportService.svc/import';
loadData := '<Root></Root>'
Buffer := TMemoryStream.Create;
loadData.SaveToStream(Buffer);
responseData := HTTP.Post(Query, Buffer);
except
on E: EIdHTTPProtocolException do
ShowMessage(E.Message);
end;
end;这将返回HTTP/1.1 400坏请求。如果使用来自http://priem.edu.ru:8000/import/ImportService.svc/test/import的get,我将得到正确的xml文档作为响应。为什么会发生这种事?我检查了在google...but中所能找到的所有信息,没有任何帮助。
我使用XE3
UPD:测试客户端工作fine...C# + webclient类。delphi...not可能还存在更多的东西,只有IdHTTP吗?
发布于 2013-04-11 06:54:14
编辑
结果表明,Charset和ContentType的赋值顺序非常重要。
如果使用包含ContentType、xml-external-parsed-entity单词或以+xml结尾的字符集,则在所有其他情况下,字符集强制设置为值'us-ascii'和'ISO-8859-1'。
这种行为是没有文档的,所以您可以自由地认为它是一个bug或一个实现细节。
雷米在“TIdEntityHeaderInfo.SetContentType”(IdHTTPHeaderInfo.pas)一书中的评论说:
// RLebeau: RFC 3023节3.1、3.3、3.6和8.5: // // Conformant与RFC2046,如果接收到文本/xml实体的 //省略字符集参数、MIME处理器和XML处理器 //必须使用默认的字符集值"us-ascii"ASCII。在某些情况下 //其中XML实体通过HTTP传输,默认为 //字符集值仍然是"us-ascii“。(注:有一个 //本规范与HTTP/1.1之间的不一致性,HTTP/1.1使用 // ISO-8859-1 ISO8859作为默认的历史原因。因为 // XML是一种新格式,应该选择新的默认值 // I18N。美国ASCII是被选中的,因为它是UTF-8的交点。 //和ISO-8859-1,因为MIME已经使用了它。
要更改字符集,必须在设置ContentType值之后设置它,如下所示:
HTTP.Request.ContentType := 'text/xml';
HTTP.Request.Charset := 'utf-8';原始答案
(仍然有效)
您正在指示您的内容是用utf-8编码的,但是Delphi默认是utf-16编码的。
我手头没有Delphi来检查字符串助手是否有支持编码的重载版本的SaveToStream方法,但我敢打赌是这样的,所以您可以尝试:
loadData.SaveToStream(Buffer, TEncoding.UTF8);在发送数据之前。
发布于 2013-04-11 10:32:02
我发现了错误。如果内容类型为*/xml IdHTTP将字符集更改为“us”.要使该组件正常工作,您需要更改
HTTP.Request.Charset := 'utf-8';
HTTP.Request.ContentType := 'text/xml';至
HTTP.Request.ContentType := 'text/xml; charset=utf-8';因此,IdHTTP不能更改字符集给我们-ansi和你会得到你想要的编码。
https://stackoverflow.com/questions/15924525
复制相似问题