Dropbox API中缺少必填字段“grant_type”

时间:2017-10-26 08:51:38

标签: php dropbox-api guzzle

我正在尝试使用dropbox api来显示主列表文件夹,当我尝试从授权用户那里获取访​​问令牌时,我遇到了很多问题。

我的代码非常简单,我从代码中获取权限。并且检索令牌的请求就是这个。

$client = new GuzzleHttp\Client();

try{
//    $response = $client->get("https://www.dropbox.com/oauth2/authorize?client_id=". $client_id . "&response_type=code");

    $response = $client->post("https://api.dropboxapi.com/oauth2/token",
        array(
            'json'  => array(
                'grant_type'    => 'authorization_code',
                'code' => '********ZJtDI'
            ),
            'auth'      => array(
                $client_id,
                $client_secret
            ), 
        ));

    echo $response->getBody();

}catch ( \Exception $e ){
    echo $e->getMessage();
}

Client error: `POST https://api.dropboxapi.com/oauth2/token` resulted in a `400 Bad Request` response:
{"error_description": "missing required field \"grant_type\"", "error": "invalid_request"}

2 个答案:

答案 0 :(得分:1)

您的POST请求必须包含application/x-www-form-urlencoded编码的POST数据,而不是JSON字符串。见https://www.dropbox.com/developers-v1/core/docs#oa2-token。并阅读http://docs.guzzlephp.org/en/stable/quickstart.html#post-form-requests以发送包含普通表单字段的POST请求。

答案 1 :(得分:1)

正如Progman所说,你必须使用通常的表单类型(application/x-www-form-urlencoded)而不是JSON。

Guzzle很简单:

$response = $client->post("https://api.dropboxapi.com/oauth2/token",
    array(
        'form_params' => array(
            'grant_type' => 'authorization_code',
            'code' => '********ZJtDI',
            'client_id' => $client_id,
            'client_secret' => $client_secret,
        ),
    )
);