在GAE上使用file_get_contents无效标头问题

时间:2014-02-27 14:45:20

标签: google-app-engine

我正在使用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);

谢谢!

2 个答案:

答案 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问题

引用的上述代码