为什么 file_get_contents return 错误?

Why file_get_contents return error?

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

我尝试使用 file_get_contents 发送 http 请求,但是 它是 return 错误

这是我的代码

// 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): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /var/www/html/api/auth_proc2.php on line 33


这是使用 set_error_handler()

获取的另一条错误消息

file_get_contents(): Content-type not specified assuming application/x-www-form-urlencoded

我看不懂这种情况
因为我在 http header 中发送 Content-type allow_url_fopen = on 在我的 php.ini

请帮帮我~!谢谢。

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

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

尝试用以下代码替换您的代码,看看会得到什么。

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