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我得到正确的XML文档中的响应。 为什么会这样呢? 我检查了所有我可以在谷歌找到......但没有什么帮助。
即时通讯使用RAD德尔福XE3
UPD:测试客户端工作正常... C#+ WebClient类。 可能更多的东西存在德尔福......不仅IdHTTP?
编辑
原来的的分配顺序Charset
和ContentType
是非常重要的。
如果您使用ContentType
包含xml
, xml-external-parsed-entity
的词或结尾+xml
,该字符集被强制设置为值'us-ascii'
和'ISO-8859-1'
在所有其他情况。
该行为是无证,所以你可以自由地认为这是一个错误或实现细节。
从雷米评论中的身体TIdEntityHeaderInfo.SetContentType
( IdHTTPHeaderInfo.pas
)说:
// RLebeau:根据RFC 3023条第3.1,3.3,3.6和8.5:
//
//符合的与[RFC2046],如果文本/ XML实体接收到具有
// charset参数省略,MIME处理器和XML处理器
//必须使用 “US-ASCII”[ASCII]的默认字符集值。 在案件
//其中XML MIME实体是通过HTTP发送,则默认
//字符集值仍是 “US-ASCII”。 (注:有一个
//本说明书和HTTP / 1.1,其使用之间的不一致
// ISO-8859-1 [ISO8859]作为默认为一个历史原因。 以来
// XML是一种新格式,新的默认应该选择更好
//国际化。 US-ASCII被选择,因为它是UTF-8的交点
//和ISO-8859-1,因为它已经使用MIME)。
要更改字符集,则必须在设置后,将其设置ContentType
值,就像这样:
HTTP.Request.ContentType := 'text/xml';
HTTP.Request.Charset := 'utf-8';
原来的答案
(还是有效)
你说明你的内容在编码utf-8
但德尔福的字符串是utf-16
默认编码。
我没有德尔福在手,以检查串助手有一个重载版本SaveToStream
支持的编码方法,但我敢打赌,它有,所以你可以尝试:
loadData.SaveToStream(Buffer, TEncoding.UTF8);
之前发送数据。
我发现了错误。 如果内容类型为* / XML IdHTTP改变字符集为“美国ANSI” ......为了使这个组件正常工作,你需要改变
HTTP.Request.Charset := 'utf-8';
HTTP.Request.ContentType := 'text/xml';
至
HTTP.Request.ContentType := 'text/xml; charset=utf-8';
所以IdHTTP不能改变字符集,以美国ANSI,你会得到编码你想要的。