我正在使用php开发谷歌应用程序。我需要使用Podio-php API从Podio使用REST服务。但是它使用了cURL,我知道GAE不允许这样做。所以我尝试通过卷曲模拟器调整podio-php lib来使用file_get_contents。在本地工作正常,但是当我部署它时,没有任何作用。我收到此错误消息:
警告:file_get_contents(https://api.podio.com:443/oauth/token): 无法打开流:无效的标头。必须是一个字符串。在 /base/data/home/apps/s~wt-project1/9.374066902612513343/static/curlEmulator.php 在第167行
然后,我没有得到任何回复,它打破了所有的应用程序。
任何人都知道问题出在哪里?
这是电话:
$options = array(
"ssl"=>array(
"allow_self_signed"=>true,
"verify_peer"=>false,
),
'http' => array(
'method' => $method,
'header' => $this->getValue(CURLOPT_HTTPHEADER),
'content' => $content
)
);
$context = stream_context_create($options);
file_get_contents($this->CURLOPT_URL, false, $context);
谢谢!
答案 0 :(得分:1)
我在调用HTTPS API的Google App Engine上遇到了同样的问题。
我发现问题是标题格式。
我从数组切换到原始字符串,如下所示:
之前:
$base64ClientID = base64_encode(SANDBOX_CLIENT_ID . ":" . SANDBOX_SECRET_ID);
$context_opts = array(
"http" => array(
"method" => "POST",
"header" => array("Accept: application/json",
"Content-Type: application/x-www-form-urlencoded",
"Authorization: Basic " . $base64ClientID),
"content" => "grant_type=client_credentials"
),
"ssl" => array(
"allow_self_signed" => true,
"verify_peer" => false
)
);
$context = stream_context_create($context_opts);
$result = file_get_contents(...)
后:
$base64ClientID = base64_encode(SANDBOX_CLIENT_ID . ":" . SANDBOX_SECRET_ID);
$context_opts = array(
"http" => array(
"method" => "POST",
"header" => "Accept: application/json\r\nContent-Type: application/x-www-form-urlencoded\r\nAuthorization: Basic " . $base64ClientID,
"content" => "grant_type=client_credentials"
),
"ssl" => array(
"allow_self_signed" => true,
"verify_peer" => false
)
);
$context = stream_context_create($context_opts);
$result = file_get_contents(...)
这解决了我所有的问题。
希望这会有所帮助。
答案 1 :(得分:0)
file_get_contents
不支持HTTPS,因此它会将握手视为无效标题。
我不知道GAE中有哪些替代品可用,但您应该寻找支持的OAUTH库,或者替代支持HTTPS连接的file_get_contents。
我建议使用以下代码来确定您是否可以使用HTTPS包装。
$w = stream_get_wrappers();
echo 'openssl: ', extension_loaded ('openssl') ? 'yes':'no', "\n";
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
echo 'wrappers: ', var_dump($w);
参考:从this问题
引用的上述代码