2

我想在框架中创建一个CloudFlare客户端。Firemonkey对于那些不知道的人,CloudFlare 可以作为任何拥有网站的人的 CDN。它们有一个可用的 API,并且与许多 Web API 一样,它们JSON与基于令牌的系统一起使用。它需要帐户电子邮件地址和帐户令牌才能访问 API。它在 HTTPS 上运行,您可以想象,尝试通过 HTTP/非 SSL 访问 API 只会产生空结果。

我希望创建的应用程序将用作一体化管理工具,旨在消除我使用 Web 浏览器来管理我的 CloudFlare 设置的需要。我遇到了最基本的问题;SSL 发布。看,我可以通过网络浏览器提交 API 请求并获取结果列表(例如https://www.cloudflare.com/api_json.html?a=stats&z=DOMAIN&u=EMAIL&tkn=TOKEN- 出于明显原因删除了个人详细信息),但我不确定我将如何获得这些相同的结果(或来自 API 的任何结果就此而言)在Firemonkey中。

我已经Overbyte ICS安装了 SSL,以及基本的捆绑Indy组件,但我很难开始使用它。我需要https://www.cloudflare.com/api_json.html通过 HTTPS/SSL 发布参数列表,但我不知道从哪里开始。我已经看到了一些围绕 SO 的各种示例,主要使用 ICS,但我一直无法找到任何特定于使用多个参数发布的内容、我应该如何格式化它等等。

我尝试的一个示例是使用 ICS TSSLHttpCli,将我的参数写为单个字符串(即a=stats&z=DOMAIN&u=EMAIL&tkn=TOKEN),将其写入SendStreamof TSSLHttpCli,寻找0,0,设置 URL(即https://www.cloudflare.com/api_json.html?),然后调用该Post方法。但是,这给了我Connection aborted on request. 这是我尝试过的代码(尽管我已经用通用值替换了个人详细信息);

var
  Data : AnsiString;
  RcvStrm, SndStrm : TMemoryStream;
begin
  SndStrm := TMemoryStream.Create;
  RcvStrm := TMemoryStream.Create;
  Data := '?a=stats&z=MYDOMAIN&u=MYEMAIL&tkn=MYTOKEN';
  SslHttpCli.SendStream := SndStrm;
  SslHttpCli.SendStream.Write(Data[1],Length(Data));
  SslHttpCli.SendStream.Seek(0,0);
  Memo1.Lines.LoadFromStream(SndStrm);
  ShowMessage('Waiting!');
  SslHttpCli.RcvdStream := RcvStrm;
  SslHttpCli.URL := 'https://www.cloudflare.com/api_json.html';
  SslHttpCli.Post;
  Memo1.Lines.Clear;
  Memo1.Lines.LoadFromStream(RcvStrm);
  Memo1.Lines.Add('.....');
  RcvStrm.Free;
  SndStrm.Free;
  ShowMessage('Complete!');
end;

这些ShowMessage程序只是为了提供视觉中断,因此我每次都可以查看流中的数据。当Memo1.Lines.LoadFromStream(SndStrm);被调用时,我按预期得到一个问号,Data即备忘录中的内容。

当我调用时Memo1.Lines.LoadFromStream(RcvStrm);,我希望它添加来自 API 的返回结果,然后添加它下面的 5 个点。但是,这并没有发生,很明显我收到的消息与问题有关。我假设我没有正确设置数据,但我只是不确定在尝试发布之前我应该​​如何格式化它。我什至将下面的所有内容都注释掉Memo1.Lines.LoadFromStream(RcvStrm);到最后,看看是否在Clear备忘录上调用了该过程,但备忘录的内容与我调用时的内容保持一致LoadFromStream(SndStrm)。决赛ShowMessage也不叫。

我最初尝试使用 String 而不是 AnsiString,但这只是输出 Data 的第一个字符而不是整个字符串。

它不起作用的原因可能有很多(API访问的所有细节都是正确的,所以这是代码的问题),但我需要有更多经验和知识的人来指引我正确的方向。

我的网络编码知识有限,到目前为止我只在Delphi中处理过基本的SQL和FTP。一旦我完成了这一步,我仍然必须使用解析的 JSON,但是现在,任何人都可以帮助我完成这项工作,这样我就可以开始了吗?

4

2 回答 2

0

我注意到您似乎通过 GET 请求解决了这个问题,但我注意到您的 POST 请求存在两个直接问题:

  1. 正如 Runner 建议的那样,删除“?” 在您的数据中。这 '?' 仅在将参数附加到 GET 请求中的 URL 时使用。

  2. 您永远不会设置 HTTP 请求的内容类型(应该是application/x-www-form-urlencoded)。您可以使用以下代码执行此操作:

    SSLHttpCli.ContentTypePost := 'application/x-www-form-urlencoded';

只是一个有用的想法。我检查了https://www.cloudflare.com/docs/client-api.html,他们提到接受 POST 请求。服务器可能会拒绝具有任何其他内容类型的请求。

如果您需要通过 POST 请求联系另一个 API 并想使用 Overbyte 组件,请稍加思考。

希望信息有用!

于 2013-05-10T18:50:00.397 回答
0

尝试这个;

SndStrm := TMemoryStream.Create;
RcvStrm := TMemoryStream.Create;
Data := 'a=stats&z=MYDOMAIN&u=MYEMAIL&tkn=MYTOKEN';
SndStrm.Write(Data[1], Length(Data));
SndStrm.Seek(0, 0);
SslHttpCli.SendStream := SndStrm;
于 2020-04-08T14:42:17.987 回答