IDHTTP.Post错误(IDHTTP.Post error)

2019-10-18 00:21发布

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?

Answer 1:

编辑

原来的的分配顺序CharsetContentType是非常重要的。

如果您使用ContentType包含xmlxml-external-parsed-entity 的词或结尾+xml ,该字符集被强制设置为值'us-ascii''ISO-8859-1'在所有其他情况。

该行为是无证,所以你可以自由地认为这是一个错误或实现细节。

从雷米评论中的身体TIdEntityHeaderInfo.SetContentTypeIdHTTPHeaderInfo.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);

之前发送数据。



Answer 2:

我发现了错误。 如果内容类型为* / XML IdHTTP改变字符集为“美国ANSI” ......为了使这个组件正常工作,你需要改变

HTTP.Request.Charset := 'utf-8';
HTTP.Request.ContentType := 'text/xml';

HTTP.Request.ContentType := 'text/xml; charset=utf-8';

所以IdHTTP不能改变字符集,以美国ANSI,你会得到编码你想要的。



文章来源: IDHTTP.Post error