我正在尝试使用 Delphi XE3 和 Indy10 编写一个使用 Mashape API 服务的客户端应用程序,但我遇到了一些障碍。
这是我尝试过的:
我将 TIdHTTP
和 TIdSSLIOHandlerSocketOpenSSL
组件放在我的表单上,并使用 TIdHTTP.IOHandler
属性将它们链接在一起。然后我在我的表单上放置了一个按钮和备忘录,并将以下代码放在按钮 OnClick
事件上:
procedure TForm1.Button2Click(Sender: TObject);
begin
IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
IdHTTP1.Request.CustomHeaders.AddValue('X-Mashape-Key: ','<my_api_key>');
Memo1.Lines.Text := IdHTTP1.Get('https://hbrd-v1.p.mashape.com/anime/log-horizon');
end;
然后我启动我的应用程序,当我按下按钮时,应用程序将等待片刻,然后吐出一条 HTTP/1.1 403 Forbidden
错误消息。第二次按下按钮将导致 HTTP/1.1 500 Internal Service Error
消息。
我已经检查过我的系统上是否有所需的 SSL 库文件,我确实有,而且我一次又一次地测试了我的凭据,它们看起来是正确的,而且我知道 url 是正确的,所以我一定是我的代码中缺少某些东西才会导致显示这些错误。我希望在这方面有更多经验的人可以提供一些建议。
更新:这是有效的 TRESTClient
代码:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IPPeerClient, Vcl.StdCtrls,
REST.Response.Adapter, REST.Client, Data.Bind.Components,
Data.Bind.ObjectScope;
type
TForm1 = class(TForm)
RESTClient1: TRESTClient;
RESTRequest1: TRESTRequest;
Button1: TButton;
Memo1: TMemo;
RESTResponse1: TRESTResponse;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
RESTClient1.BaseURL := 'https://hbrd-v1.p.mashape.com/anime/log-horizon';
RESTRequest1.Execute;
Memo1.Lines.Text := RESTResponse1.Content;
// The only thing not shown here is the RESTRequest1.Params which are
// Name: 'X-Mashape-Key'
// Value: 'my-api-key'
// Kind: pkHTTPHEADER
// Everything else is included here which isn't much.
end;
end.
我想用 TIdHTTP
做同样的事情。
最佳答案
如果不看到实际的 HTTP 消息来回传输,就很难知道实际发生了什么。当 HTTP 响应指示错误时,EIdHTTPProtocolException
引发异常,其 ErrorMessage
属性包含服务器响应的主体。它是否为您提供了有关错误发生原因的任何指示?
但是,您确实需要更改此设置:
IdHTTP1.Request.CustomHeaders.AddValue('X-Mashape-Key: ','<my_api_key>');
对此:
IdHTTP1.Request.CustomHeaders.Values['X-Mashape-Key'] := '<my_api_key>';
并摆脱程序化 IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
作业,因为您已经在表单设计器中处理了它。
除此之外,403
错误意味着服务器不接受您的凭据。我没有看到您向 TIdHTTP.Request.Username
分配任何凭证和 TIdHTTP.Request.Password
您的代码中的属性,您是在表单设计器中这样做的吗?
TIdHTTP
使用插件系统来处理 HTTP 身份验证方案。如果服务器允许 BASIC
身份验证,您可以设置 TIdHTTP.Request.BasicAuthentication
属性为真所以 BASIC
当没有其他身份验证方案可用时,用作默认值。您可以使用 TIdHTTP.OnSelectAuthorization
事件以查看服务器实际支持哪些身份验证。
如果服务器想要一个非BASIC
身份验证,您需要添加相关的 IdAuthentication...
给你的uses
启用该插件的子句。例如,IdAuthenticationDigest
对于 DIGEST
身份验证,IdAuthenticationNTLM
对于 NTLM
身份验证等。或者,添加 IdAllAuthentications
单元而不是启用所有插件。
如果您需要使用 Indy 不支持的 HTTP 身份验证(例如 OATH
),您可以:
使用
TIdHTTP.Request.CustomHeaders.Values['Authorization']
手动提供相关凭证数据。实现自定义
TIdAuthentication
-派生类,并将其实例分配给TIdHTTP.Request.Authorization
属性或其类类型为VAuthenticationClass
TIdHTTP.OnSelectAuthorization
的参数事件。
关于delphi - 使用 Indy10 访问 Mashape API 服务的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24643655/