将file_get_contents与基本身份验证和SSL一起使用

时间:2018-05-31 21:02:51

标签: php file-get-contents

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

$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;

以下是我收到的错误消息:

  

警告:file_get_contents(https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api):无法打开流:HTTP请求失败! HTTP / 1.0 500服务器错误...

我已经确认openssl已启用:

enter image description here

我们不妨预先解决这个问题:

为什么不使用cURL?

我可以。但我也想弄清楚file_get_contents无效的原因。我喜欢file_get_contents的相对简单性。叫我疯了。

2 个答案:

答案 0 :(得分:0)

好奇心是一件好事,所以在解决这个问题之前不要回到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。因此,您对SLL / TLS以及您的用户代理没有任何问题,就这样。它只是支持HTTP / 1.1的服务器 如果它适用于我们的Web浏览器,那是因为它们也使用HTTP / 1.1。

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

注意:在此示例中,我获得了401,因为我的凭据错误。这意味着我成功点击了服务器,如果我的凭据有效,一切都会好的。

答案 1 :(得分:-1)

编辑:我的坏,不要看到这不是卷曲。试试这个

$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;