将 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 的原因。
我正在使用 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 的原因。