web-dev-qa-db-fra.com

Guzzle - Laravel. Comment faire une demande avec x-www-form-url-encoded

J'ai besoin d'intégrer une API donc j'écris la fonction:

public function test() {

    $client = new GuzzleHttp\Client();

try {
    $res = $client->post('http://example.co.uk/auth/token', [

    'headers' => [
        'Content-Type' => 'application/x-www-form-urlencoded',
            ],

    'json' => [
        'cliend_id' => 'SOMEID',
        'client_secret' => '9999jjjj67Y0LBLq8CbftgfdreehYEI=',
        'grant_type' => 'client_credentials'
]
            ]);

$res = json_decode($res->getBody()->getContents(), true);
dd($res);

}
catch (GuzzleHttp\Exception\ClientException $e) {
        $response = $e->getResponse();
        $result =  json_decode($response->getBody()->getContents());

    return response()->json(['data' => $result]);

    }

}

comme réponse, j'ai reçu un message:

{"data":{"error":"invalid_clientId","error_description":"ClientId should be sent."}}

Maintenant, lorsque j'essaie d'exécuter la même URL avec les mêmes données dans l'application POSTMAN, j'obtiens des résultats corrects:

enter image description here

Qu'est-ce qui est mauvais dans mon code? J'envoie le bon form_params aussi j'essaye de changer form_params en json mais encore une fois j'ai la même erreur ...

Comment résoudre mon problème?

6
Aleks Per

Le problème est que dans Postman, vous envoyez les données sous forme de formulaire, mais dans Guzzle, vous passez les données dans le 'json' clé du tableau d'options.

Je parie que si vous changez le 'json' à 'form_params' vous obtiendrez le résultat que vous recherchez.

$res = $client->post('http://example.co.uk/auth/token', [
    'form_params' => [
        'client_id' => 'SOMEID',
        'client_secret' => '9999jjjj67Y0LBLq8CbftgfdreehYEI=',
        'grant_type' => 'client_credentials'
    ]
]);

Voici un lien vers les documents en question: http://docs.guzzlephp.org/en/stable/quickstart.html#sending-form-fields

De plus, j'ai remarqué une faute de frappe - vous avez cliend_id au lieu de client_id.

12
Dylan Pierce