首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IDHTTP.Post错误

IDHTTP.Post错误
EN

Stack Overflow用户
提问于 2013-04-10 11:25:26
回答 2查看 7.7K关注 0票数 1
代码语言:javascript
复制
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吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-11 06:54:14

编辑

结果表明,CharsetContentType的赋值顺序非常重要。

如果使用包含ContentTypexml-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值之后设置它,如下所示:

代码语言:javascript
复制
HTTP.Request.ContentType := 'text/xml';
HTTP.Request.Charset := 'utf-8';

原始答案

(仍然有效)

您正在指示您的内容是用utf-8编码的,但是Delphi默认是utf-16编码的。

我手头没有Delphi来检查字符串助手是否有支持编码的重载版本的SaveToStream方法,但我敢打赌是这样的,所以您可以尝试:

代码语言:javascript
复制
loadData.SaveToStream(Buffer, TEncoding.UTF8);

在发送数据之前。

票数 2
EN

Stack Overflow用户

发布于 2013-04-11 10:32:02

我发现了错误。如果内容类型为*/xml IdHTTP将字符集更改为“us”.要使该组件正常工作,您需要更改

代码语言:javascript
复制
HTTP.Request.Charset := 'utf-8';
HTTP.Request.ContentType := 'text/xml';

代码语言:javascript
复制
HTTP.Request.ContentType := 'text/xml; charset=utf-8';

因此,IdHTTP不能更改字符集给我们-ansi和你会得到你想要的编码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15924525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档