我想在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
),将其写入SendStream
的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,但是现在,任何人都可以协助我完成这项工作,这样我就可以开始了吗?
我注意到你似乎用GET请求解决了这个问题,但我注意到你的POST请求有两个直接问题:
application/x-www-form-urlencoded
)。您可以使用以下代码执行此操作:
SSLHttpCli.ContentTypePost := 'application/x-www-form-urlencoded';
只是一个有益的想法。我检查了https://www.cloudflare.com/docs/client-api.html,他们提到POST请求被接受了。服务器可能拒绝具有任何其他内容类型的请求。
如果您需要通过POST请求联系其他API并想要使用Overbyte组件,那么只需要考虑一些问题。
希望信息有用!