PHP GuzzleHttp. Comment faire une demande de publication avec des paramètres?

104

Comment faire une demande de publication avec GuzzleHttp (version 5.0).

J'essaye de faire ce qui suit:

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

Mais j'obtiens l'erreur:

Erreur fatale PHP: exception non interceptée 'InvalidArgumentException' avec le message 'Aucune méthode ne peut gérer la clé de configuration de l'e-mail'

Arsen
la source

Réponses:

94

Essaye ça

$client = new \GuzzleHttp\Client();
$client->post(
    'http://www.example.com/user/create',
    array(
        'form_params' => array(
            'email' => '[email protected]',
            'name' => 'Test user',
            'password' => 'testpassword'
        )
    )
);
Marco
la source
90
Cette méthode est désormais obsolète dans la version 6.0. Au lieu de «body», utilisez «form_params».
jasonlfunk
5
La transmission de l'option de requête "body" en tant que tableau pour envoyer une requête POST est obsolète. Veuillez utiliser l'option de requête "form_params" pour envoyer une requête application / x-www-form-urlencoded, ou l'option de requête "multipart" pour envoyer une requête multipart / form-data.
Jeremy Quinton
@JeremyQuinton, alors ce que vous avez sélectionné à la place de cela ... s'il vous plaît répondre
Madhur
@madhur regardez la réponse ci
Jeremy Quinton
veuillez modifier la réponse et ajouter ceci "Cette méthode est désormais obsolète dans la version 6.0. Au lieu de 'body', utilisez 'form_params'" dessus
a828h
185

Depuis la réponse de Marco est dépréciée , vous devez utiliser la syntaxe suivante (selon le 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 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 les paramètres

// 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 POST asynchrones

Utile pour les longues opérations de serveur.

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

Définir les en-têtes

Selon la documentation , vous pouvez définir des en-têtes:

// Set various headers on a request
$client->request('GET', '/get', [
    'headers' => [
        'User-Agent' => 'testing/1.0',
        'Accept'     => 'application/json',
        'X-Foo'      => ['Bar', 'Baz']
    ]
]);

Plus d'informations pour le débogage

Si vous voulez plus d'informations, vous pouvez utiliser une debugoption comme celle-ci:

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

La documentation est plus explicite sur les nouvelles possibilités.

Samuel Dauzon
la source
Comment puis-je envoyer une chaîne de requête dans une demande de publication?
Raheel
Que recherchez-vous? Si la chaîne de requête fait partie de l'URL, vous devez l'ajouter directement dans l'URL comme example.com/user/create?mode=dev " .
Samuel Dauzon
J'essaie d'envoyer une demande de publication à paypal avec des données encodées par URL. Je pense que sa clé ['body'].
Raheel
Pour envoyer une chaîne de requête dans les demandes de publication, j'ai trouvé mieux en utilisant l'option 'query' dans les paramètres, car d'une manière ou d'une autre, dans la chaîne d'url, il ne fallait que la première docs.guzzlephp.org/en/latest/request-options.html# query
marcostvz
1
@ clockw0rk J'ai ajouté une partie en-têtes HTTP pour vous. Vous avez le lien vers la doc
Samuel Dauzon
37

Notez que dans Guzzle V6.0 +, une autre source de l'erreur suivante peut être une utilisation incorrecte de JSON en tant que tableau:

La transmission de l'option de requête "body" en tant que tableau pour envoyer une requête POST est obsolète. Veuillez utiliser l'option de requête "form_params" pour envoyer une requête application / x-www-form-urlencoded, ou l'option de requête "multipart" pour envoyer une requête 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',
    ])
])
Scott Yang
la source
1
$client = new \GuzzleHttp\Client();
$request = $client->post('http://demo.website.com/api', [
    'body' => json_encode($dataArray)
]);
$response = $request->getBody();

Ajouter

openssl.cafiledans le php.inifichier

Prakash D
la source