为什么file_get_contents会返回错误?

时间:2016-04-08 02:28:09

标签: php oauth file-get-contents yahoo-api

我正在使用OAuth连接Yahoo.jp登录API

我尝试发送http请求使用file_get_contents但它返回错误

这是我的代码

// my apps setting 
    $client_id = 'dj0zaiZpP~~~~~~~~~~~~~~~';
    $appSecret = '129ad~~~~~~~~~~~~~~~~';

    // the data to send
    $data = array(
        'grant_type' => 'authorization_code',
        'redirect_uri' => 'My_redierct_page', 
        'code' => $_GET['code']

    );
    $data = http_build_query($data);

    $header = array(
        "Authorization: Basic " . base64_encode($client_id . ':' . $appSecret),
        "Content-Type: application/x-www-form-urlencoded",
        "Content-Length: ".strlen($data)
    );

    // build your http request
    $context = stream_context_create(array(
        'http' => array(
            'method' => 'POST', 
            'header' => implode("\r\n", $header),
            'content' => $data, 
            'timeout' => 10
            )
        ));

    // send it
    $resp = file_get_contents('https://auth.login.yahoo.co.jp/yconnect/v1/token', false, $context);
    $json = json_decode($resp);

    echo($json->token_type . " " . $json->access_token);

结果......

  

file_get_contents(https://auth.login.yahoo.co.jp/yconnect/v1/token):无法打开流:HTTP请求失败!第33行/var/www/html/api/auth_proc2.php中的HTTP / 1.0 400错误请求


以下是使用set_error_handler()

的其他错误消息
  

file_get_contents():假设application / x-www-form-urlencoded

未指定Content-type

我无法理解这种情况 因为我在http标头中发送内容类型 和我的php.ini中的allow_url_fopen = on

请帮帮我〜!感谢。

2 个答案:

答案 0 :(得分:0)

我认为这可能是因为您使用Content-Type而非Content-typeContent-Length而不是Content-length

答案 1 :(得分:0)

我建议使用的另一件事是CURL而不是file_get_contents有多种原因;首先,您可以更好地控制请求,其次是在处理API时使用curl请求更为标准,第三,您将能够更好地了解您的问题。< / p>

尝试使用以下内容替换您的代码并查看您获得的内容。

$client_id = 'dj0zaiZpP~~~~~~~~~~~~~~~';
$appSecret = '129ad~~~~~~~~~~~~~~~~';

$data = array(
    'grant_type' => 'authorization_code',
    'redirect_uri' => 'My_redierct_page', 
    'code' => $_GET['code']
);

$curl = curl_init('https://auth.login.yahoo.co.jp/yconnect/v1/token'); 

curl_setopt($curl, CURLOPT_POST, true); 
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($curl, CURLOPT_USERPWD, $client_id . ':' . $appSecret);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 

$response = curl_exec($curl);
$info = curl_getinfo($curl);

print_r($response);
echo '<br /><br />';
print_r($info);

curl_close($curl);