我是HTTP新手。我有几个HTTP GET返回以ANSI或UTF-8编码的文本。有没有办法确定返回哪个,以便我可以处理方法中的转换,而不是进行试验并对每个转换进行必要的转换?或者它是否可以由Indy自己处理?
这是我用来获取的东西:
主要方法
procedure TIdHTTPHelper.SendGet
( const AURL : String;
var AResponse: TMemoryStream );
begin
Request.ContentType := '';
Request.ContentLength := -1;
Get ( AURL, AResponse );
AResponse.Position := 0;
end;
字符串重载方法
procedure TIdHTTPHelper.SendGet
( const AURL : String;
var AResponse: String);
var
Response : TMemoryStream;
begin
Response := TMemoryStream.Create;
SendGet ( AURL, Response );
SetLength ( AResponse, Response.Size div 2 );
Response.Read ( AResponse [1], Response.Size );
Response.Free;
end;
答案 0 :(得分:1)
TIdHTTP
的重载版Get()
会返回String
(在D2009中为UnicodeString
+在早期版本中为AnsiString
。它检测响应字符集,甚至在HTTP标头中不存在时从HTML和XML数据中解析它,并使用它将响应数据解码为D2009 +中的UTF-16和早期版本中的Ansi :
procedure TIdHTTPHelper.SendGet
( const AURL : String;
var AResponse: String);
begin
AResponse := Get ( AURL );
end;
看看这个答案,我概述了TIdHTTP
使用的确切字符集检测逻辑:
TIdHTTP character encoding of POST response
另外,另一个SendGet()
方法不应该通过引用获取TMemoryStream
,因为您没有向调用者返回新的TMemoryStream
对象。它应该取一般TStream
值。这将使您的代码更加灵活:
procedure TIdHTTPHelper.SendGet
( const AURL : String;
AResponse: TStream );
begin
Get ( AURL, AResponse );
AResponse.Position := 0;
end;