1

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次に、アプリを起動し、ボタンを押すと、アプリはしばらく待ってからエラー メッセージを吐き出します。ボタンを 2 回押すと、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

4

1 に答える 1

2

実際の 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が、フォーム デザイナーで行っていますか?

TIdHTTPHTTP 認証スキームを処理するためにプラグイン システムを使用します。サーバーでBASIC認証が許可されている場合は、TIdHTTP.Request.BasicAuthenticationプロパティを true に設定できるためBASIC、他の認証スキームが使用できない場合にデフォルトとして使用されます。このイベントを使用してTIdHTTP.OnSelectAuthorization、サーバーが実際にサポートしている認証を確認できます。

サーバーが非認証を必要とする場合は、そのプラグインを有効にするために関連する句BASICを追加する必要があります。たとえば、認証用、認証用などです。または、代わりにユニットを追加して、すべてのプラグインを有効にします。IdAuthentication...usesIdAuthenticationDigestDIGESTIdAuthenticationNTLMNTLMIdAllAuthentications

Indy がサポートしていない HTTP 認証 (OATHなど) を使用する必要がある場合は、次のいずれかを実行できます。

  1. TIdHTTP.Request.CustomHeaders.Values['Authorization']関連する資格情報データを手動で提供するために使用します。

  2. カスタム派生クラスを実装し、そのインスタンスをプロパティにTIdAuthentication割り当てるか、そのクラス タイプをイベントのパラメーターに割り当てます。TIdHTTP.Request.AuthorizationVAuthenticationClassTIdHTTP.OnSelectAuthorization

于 2014-07-09T01:09:57.670 に答える