新Bing API不支持PHP中的身份验证


New Bing API Unsupported Authentication in PHP

我一直在将工作中的应用程序从旧的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);

有人知道是什么导致身份验证失败吗?

下面是搜索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);

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

正如我在评论中对ManseUK所说的,尽管微软可以为丢失的应用程序id提供更好的错误消息,类似于"无效的应用程序"的内容可以帮助缩小的范围

减少流量和提高速度的建议:
添加Accept-Encoding: gzip并删除auth中的名称。base64_encode(':' . $this->APPID)就是你所需要的。