web-dev-qa-db-fra.com

PHP GuzzleHttp. Comment faire une demande de poste avec params?

Comment faire une demande de publication avec GuzzleHttp (version 5.0) . J'essaie de faire ce qui suit et j'obtiens une erreur

$client = new \GuzzleHttp\Client();
$client->post(
    'http://www.example.com/user/create',
    array(
        'email' => '[email protected]',
        'name' => 'Test user',
        'password' => 'testpassword'
    )
);

Erreur irrécupérable PHP: exception non récupérée 'InvalidArgumentException' avec le message 'Aucune méthode ne peut gérer la clé de configuration de messagerie'

54
Arsen

Cette méthode est maintenant obsolète en 6.0. Au lieu de 'body', utilisez 'form_params'

Essaye ça 

$client = new \GuzzleHttp\Client();
$client->post(
    'http://www.example.com/user/create',
    array(
        'body' => array(
            'email' => '[email protected]',
            'name' => 'Test user',
            'password' => 'testpassword'
        )
    )
);
50
Marco

La réponse de Marco étant obsolète, vous devez utiliser la syntaxe suivante (en fonction du commentaire de jasonlfunk): 

$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'http://www.example.com/user/create', [
    'form_params' => [
        'email' => '[email protected]',
        'name' => 'Test user',
        'password' => 'testpassword',
    ]
]);

Demande avec les fichiers POST

$response = $client->request('POST', 'http://www.example.com/files/post', [
    'multipart' => [
        [
            'name'     => 'file_name',
            'contents' => fopen('/path/to/file', 'r')
        ],
        [
            'name'     => 'csv_header',
            'contents' => 'First Name, Last Name, Username',
            'filename' => 'csv_header.csv'
        ]
    ]
]);

Utilisation des verbes REST avec params

// PUT
$client->put('http://www.example.com/user/4', [
    'body' => [
        'email' => '[email protected]',
        'name' => 'Test user',
        'password' => 'testpassword',
    ],
    'timeout' => 5
]);

// DELETE
$client->delete('http://www.example.com/user');

Données asynchrones POST

Utile pour les opérations de serveur longues.

$client = new \GuzzleHttp\Client();
$promise = $client->requestAsync('POST', 'http://www.example.com/user/create', [
    'form_params' => [
        'email' => '[email protected]',
        'name' => 'Test user',
        'password' => 'testpassword',
    ]
]);
$promise->then(
    function (ResponseInterface $res) {
        echo $res->getStatusCode() . "\n";
    },
    function (RequestException $e) {
        echo $e->getMessage() . "\n";
        echo $e->getRequest()->getMethod();
    }
);

Plus d'informations pour le débogage

Si vous voulez plus d'informations, vous pouvez utiliser l'option debug comme ceci:

$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'http://www.example.com/user/create', [
    'form_params' => [
        'email' => '[email protected]',
        'name' => 'Test user',
        'password' => 'testpassword',
    ],
    // If you want more informations during request
    'debug' => true
]);

Documentation est plus explicites sur les nouvelles possibilités.

127
jedema

Remarque: dans Guzzle version 6.0 +, une autre source d’obtention de l’erreur suivante peut être une utilisation incorrecte de JSON en tant que tableau:

Passer l'option de requête "body" en tant que tableau pour envoyer un POST La requête est obsolète. Veuillez utiliser la requête "form_params" possibilité d'envoyer une demande/x-www-form-urlencoded, ou un Option de demande "multipart" pour envoyer une demande multipart/form-data.

Incorrect :

$response = $client->post('http://example.com/api', [
    'body' => [
        'name' => 'Example name',
    ]
])

Correct :

$response = $client->post('http://example.com/api', [
    'json' => [
        'name' => 'Example name',
    ]
])

Correct :

$response = $client->post('http://example.com/api', [
    'headers' => ['Content-Type' => 'application/json'],
    'body' => json_encode([
        'name' => 'Example name',
    ])
])
24
Scott Yang
$client = new \GuzzleHttp\Client(); 
$request = $client->post('http://demo.website.com/api',['body' =>
                    json_encode($dataArray)]); $response = $request->getBody(); 

Ajouter

openssl.cafile dans le fichier php.ini

0
Prakash D