1

誰でも正しい方向を指すことができますか? 新しい Bing API を使用して Web 検索を実行しようとしていますが、以下のコードでは "HTTP/1.1 400 Bad Request" が発生し続けます。同じ要求がブラウザーでもうまく機能します (ユーザー名を空白のままにし、プロンプト ボックス内のパスワードの下にキーを提供します)。

var
  IdHTTP1 : TIdHTTP;
  uri : string;
  myIOhandler : TIdSSLIOHandlerSocketOpenSSL;
begin
  myIOhandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  with myIOhandler do
  begin
      SSLOptions.Method := sslvTLSv1;
      SSLOptions.Mode := sslmUnassigned;
      SSLOptions.VerifyMode := [];
      SSLOptions.VerifyDepth := 0;
      host := '';
  end;

  IdHTTP1:= TIdHTTP.Create(nil);
  IdHTTP1.Request.UserAgent:= 'Mozilla/3.0 (compatible; IndyLibrary)';
  IdHTTP1.Request.Accept := 'text/javascript';
  IdHTTP1.Request.ContentType := 'application/json';
  IdHTTP1.Request.ContentEncoding := 'utf-8';

  IdHTTP1.HandleRedirects:= True;
  IdHTTP1.ConnectTimeout:= 10000;
  IdHTTP1.ReadTimeout:= 10000;
  IdHTTP1.Request.CacheControl := 'no-cache';
  IdHTTP1.Request.BasicAuthentication:= True;
  IdHTTP1.Request.Authentication:= TIdBasicAuthentication.Create;
  IdHTTP1.Request.Authentication.Username:= '';
  IdHTTP1.Request.Authentication.Password:= APIKey;//Encode64(APIKey);//Encode64(APIKey+':'+APIKey)
  IdHTTP1.IOHandler:= myIOHandler;

  uri:= 'https://api.datamarket.azure.com/Bing/SearchWeb/Web?'+
          'Query=%27'+ query_text +'%27&$format=JSON&$top=50&$skip=0';
  s:= IdHTTP1.Get(uri);  

MS のドキュメントは非常に貧弱です。

4

2 に答える 2

3

TIdHTTPBasic認証を自動的に処理します。プロパティとプロパティを設定して入力するだけIdHTTP1.Request.BasicAuthentication := Trueです。直接対応する必要はありません。IdHTTP1.Request.UsernameIdHTTP1.Request.PasswordTIdBasicAuthentication

NTLM などの他の認証をサポートする場合は、関連IdAuthentication...するユニットまたはIdAllAuthenticationユニットをuses句に追加するだけです。

TIdAuthenticationIndy がネイティブにサポートしていないカスタム認証をサポートする場合は、独自のカスタム派生クラスを実装することもできます。呼び出しRegisterAuthenticationMethod()TIdHTTPカスタム クラスを自動的に使用するか、TIdHTTP.OnSelectAuthorizationイベントを使用して要求ごとに手動でクラスを割り当てることができます。

于 2012-08-01T17:20:29.027 に答える
1

問題はユーザー名にあると思います。基本認証では、次のようなヘッダーを送信する必要があります。

Authorization: Basic BASE64ENC(username:password)

あなたの場合、ユーザー名は空なので、実際にはこれを送信しています。

Authorization: Basic BASE64ENC(:password)

ドキュメントにはユーザー名を空白のままにするように記載されていますが、これはブラウザからページにアクセスした場合にのみ適用されます。ドキュメントの最後までにコードサンプルを見てください。これらの例の多くでは、ユーザー名とパスワードの両方がアカウントキーであることがわかります。

bingContainer.Credentials = new NetworkCredential(accountKey, accountKey);

コードでも同じことを行うことをお勧めします。

IdHTTP1.Request.Authentication:= TIdBasicAuthentication.Create;
IdHTTP1.Request.Authentication.Username:= APIKey;
IdHTTP1.Request.Authentication.Password:= APIKey;
于 2012-07-31T14:33:28.017 に答える