gpt4 book ai didi

delphi - 无法从 StringStream 获取字符串

转载 作者:行者123 更新时间:2023-12-01 18:59:08 25 4
gpt4 key购买 nike

我正在向 Google 的 Map API 发送 HTTP Get 请求,并用响应填充我的 StringStream。但是,当我尝试从流中读取时,我只看到一个空字符串“”。

{ Attempts to get JSON back from Google's Directions API }
function GetJSONString_OrDie(url : string) : string;
var
lHTTP: TIdHTTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
Buffer: TStringStream;
begin
{Sets up SSL}
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
{Creates an HTTP request}
lHTTP := TIdHTTP.Create(nil);
{Sets the HTTP request to use SSL}
lHTTP.IOHandler := SSL;

{Set up the buffer}
Buffer := TStringStream.Create(Result);
{Attempts to get JSON back from Google's Directions API}
lHTTP.Get(url, Buffer);

Result:= Buffer.ReadString(Buffer.Size); //An empty string is put into Result


finally
{Frees up the HTTP object}
lHTTP.Free;
{Frees up the SSL object}
SSL.Free;

end;

当我看到 StringStream Buffer 有大量数据(调用 Get 后大小为 32495)时,为什么我得到一个空字符串。

我已经测试了我的调用,并返回了有效的 JSON。

最佳答案

首先,您使用 TStringStream 接收响应数据。如果您使用的是 Delphi 2009+,请不要这样做! TStringStream特定编码相关联,在用数据填充流之前必须在构造函数中声明该编码,并且不能动态更改。默认编码是TEncoding.Default,它代表操作系统默认编码。如果 HTTP 响应使用不同编码,数据将无法正确解码为字符串

其次,在调用 ReadString() 之前,您不会将流的 Position 返回到 0。以解码的 String 形式检索 TStringStream 内容的更简单方法是使用 DataString 属性,该属性会忽略 Position 属性并整体返回整个流内容:

Result := Buffer.DataString;

第三,你做了太多的体力劳动。 TIdHTTP.Get() 有一个重载版本,它返回已解码的String。使用此方法的好处是它使用响应的实际字符集,而不是 TStringStream 的字符集:

function GetJSONString_OrDie(const URL: string): string;
var
lHTTP: TIdHTTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
{Creates an HTTP request}
lHTTP := TIdHTTP.Create(nil);
try
{Sets the HTTP request to use SSL}
lHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(lHTTP);
{Attempts to get JSON back from Google's Directions API}
Result := lHTTP.Get(URL);
finally
{Frees up the HTTP object}
lHTTP.Free;
end;
end;

如果您使用的是最新版本的 Indy,则可以进一步简化(有关详细信息,请参阅 this blog post):

function GetJSONString_OrDie(const URL: string): string;
var
lHTTP: TIdHTTP;
begin
{Creates an HTTP request}
lHTTP := TIdHTTP.Create(nil);
try
{Attempts to get JSON back from Google's Directions API}
Result := lHTTP.Get(URL);
finally
{Frees up the HTTP object}
lHTTP.Free;
end;
end;

关于delphi - 无法从 StringStream 获取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31566381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com