【发布时间】:2012-07-31 10:55:21
【问题描述】:
谁能指出正确的方向?我正在尝试使用新的 Bing API 执行网络搜索,但使用下面的代码,我不断收到“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 文档很差。
【问题讨论】:
-
您确定 HTTP 基本身份验证应该使用空用户名吗? query_text 是否正确“URL 编码”?
-
根据迁移指南文档:“将用户名字段留空,并在密码字段中输入您的帐户密钥。”
-
只是为了测试,我没有使用任何需要编码的字符。我稍后会处理。相同的字符串在浏览器中有效。
-
要找到 Indy 和浏览器请求的差异,您可以使用 Fiddler 等 HTTP 代理
-
我认为问题出在身份验证中,正如您在我的代码中看到的那样,我尝试使用 Base64 编码。有一些与 java 相关的帖子,他们使用 base64.encode,如 base64Encode(key:key)。再次没有太多可用信息...)旧的 Bing API 明天将停止工作)
标签: delphi azure delphi-xe bing indy10