0

我一直在将工作中的应用程序从旧的 Bing API 移植到新的应用程序。看过几篇关于新版本如何在 PHP 中工作的帖子后,我遇到了身份验证问题。

这是 URL 返回的错误:

Warning: file_get_contents(https://api.datamarket.azure.com/Bing/Search/Image?$format=json&Query=%27%27) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 401 The authorization type you provided is not supported. Only Basic and OAuth are supported in /home/krem81/public_html/classes/class.BingSearch.php on line 178

反过来,这是我用来与 API 交互的函数:

$accountKey = $this->Appid;

$ServiceRootURL =  "https://api.datamarket.azure.com/Bing/Search/";

$WebSearchURL = $ServiceRootURL . 'Image?$format=json&Query=';

$context = stream_context_create(array(
    'http' => array(
        'request_fulluri' => true,
        'header'  => "Authorization: Basic " . base64_encode($accountKey . ":" . $accountKey)
    )
));

$request = $WebSearchURL . urlencode( '\'' . $_POST["searchText"] . '\'');

echo($request);

$this->response = file_get_contents($request, 0, $context);

$this->results = json_decode($this->response);

自从尝试了这个我现在也尝试过

    $accountKey = $this->Appid;

    $ServiceRootURL =  "https://api.datamarket.azure.com/Bing/Search/";

    $WebSearchURL = $ServiceRootURL . 'Image?$format=json&Query=';

    $request = $WebSearchURL . urlencode( '\'' . $this->keyword . '\'');

    echo($request);

    $process = curl_init($request);
    curl_setopt($process, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($process, CURLOPT_USERPWD,  $accountKey . ":" . $accountKey);
    curl_setopt($process, CURLOPT_TIMEOUT, 30);
    curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);

    $this->response = curl_exec($process);

    var_dump($this->response);

    $this->results = json_decode($this->response);

    var_dump($this->results);

有没有人知道什么可能会触发身份验证失败?

4

3 回答 3

1

这是搜索 API 的工作示例,只需将您的访问密钥替换为“XXXX”。即使我浪费了好几个小时来使用 cURL 让它工作,但它在本地失败了“CURLOPT_SSL_VERIFYPEER”的原因:(

$url = 'https://api.datamarket.azure.com/Bing/Search/Web?Query=%27xbox%27';
$process = curl_init($url);
curl_setopt($process, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($process, CURLOPT_USERPWD, "username:XXXX");
curl_setopt($process, CURLOPT_TIMEOUT, 30);
curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($process);

# Deliver
return $response;

# Have a great day!
curl_close($process);
于 2013-04-17T13:03:00.437 回答
0

另一个团队成员更改了一个变量的名称,我想我真的应该立即检查。$this->Appid应该是$this->APPID

正如我在评论中对 ManseUK 所说,尽管微软可以为缺少的应用程序 ID 提供更好的错误消息,但类似于“无效应用程序 ID”的内容有助于缩小问题范围

于 2012-08-07T10:41:12.770 回答
0

减少流量和提高速度的建议:在身份验证中
添加Accept-Encoding: gzip和删除名称。base64_encode(':' . $this->APPID)是你所需要的全部。

于 2015-02-24T09:21:09.020 回答