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' => 'test@gmail.com',
        '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'

Réponses:


94

Essaye ça

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

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' => 'test@gmail.com',
        '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' => 'test@gmail.com',
        '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' => 'test@gmail.com',
        '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' => 'test@gmail.com',
        'name' => 'Test user',
        'password' => 'testpassword',
    ],
    // If you want more informations during request
    'debug' => true
]);

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


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',
    ])
])

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.