Overbyte ICS HTTPS POST

问题描述 投票:2回答:2

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

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

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

我尝试的一个例子是使用ICS TSSLHttpCli,将我的参数写成单个字符串(即a=stats&z=DOMAIN&u=EMAIL&tkn=TOKEN),将其写入SendStreamTSSLHttpCli,寻找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,但是现在,任何人都可以协助我完成这项工作,这样我就可以开始了吗?

delphi delphi-xe2 firemonkey indy10 cloudflare
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组件,那么只需要考虑一些问题。

希望信息有用!

© www.soinside.com 2019 - 2024. All rights reserved.