将 file_get_contents 与基本身份验证和 SSL 结合使用

Using file_get_contents with basic auth and SSL

我正在使用 file_get_contents 函数尝试使用 SSL 和基本身份验证的 GET 请求:

$username = "XXXXXXXXXX";
$password = "XXXXXXXXXX";

$url = "https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api";

$context = stream_context_create(array("http" => array("header" => "Authorization: Basic " . base64_encode("$username:$password"))));

$data = file_get_contents($url, false, $context);

echo $data;

这是我收到的错误消息:

Warning: file_get_contents(https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api): failed to open stream: HTTP request failed! HTTP/1.0 500 Server Error...

我已经确认 openssl 已启用:

我们不妨提前解决这个问题:

你为什么不直接使用 cURL?

我可以。但我也想弄清楚为什么 file_get_contents 不起作用。我喜欢 file_get_contents 的相对简单。叫我疯子。

编辑:不好意思,没看出来这不是 curl。试试这个

$username = "XXXXXXXXXX";
$password = "XXXXXXXXXX";

$url = "https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api";

$context = stream_context_create(array(
"http" => array("header" => "Authorization: Basic " . base64_encode("$username:$password")), 
"ssl"=>array(
    "verify_peer"=>false,
    "verify_peer_name"=>false,
)));

$data = file_get_contents($url, false, $context);

echo $data;

好奇心是个好东西,所以在解决这个问题之前不退回到 cURL 来挖掘这个问题是很酷的。

<?php
$username = "XXXXXXXXXX";
$password = "XXXXXXXXXX";

$url = "https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api";

$context = stream_context_create(array(
    "http" => array(
        "header" => "Authorization: Basic " . base64_encode("$username:$password"),
        "protocol_version" => 1.1, //IMPORTANT IS HERE
    )));

$data = file_get_contents($url, false, $context);

echo $data;

事实上服务器不支持HTTP/1.0。所以你对 SSL/TLS 和你的用户代理没有任何问题。只是从1.1开始支持HTTP的服务器。

stream_context_create 文档中所述,stream_context_create 中使用的默认 protocol_version 是1.0。这就是您收到错误 500 的原因。