PHP GuzzleHttp. Come fare una richiesta di post con params?


100

Come effettuare una richiesta di post con GuzzleHttp (versione 5.0).

Sto cercando di fare quanto segue:

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

Ma ricevo l'errore:

Errore irreversibile PHP: eccezione non rilevata "InvalidArgumentException" con il messaggio "Nessun metodo può gestire la chiave di configurazione dell'email"

Risposte:


92

Prova questo

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

89
Questo metodo è ora deprecato nella 6.0. Invece di "body" usa "form_params".
jasonlfunk

5
Il passaggio dell'opzione di richiesta "body" come array per inviare una richiesta POST è stato deprecato. Utilizza l'opzione di richiesta "form_params" per inviare una richiesta application / x-www-form-urlencoded, o un'opzione di richiesta "multipart" per inviare una richiesta multipart / form-data.
Jeremy Quinton

@ JeremyQuinton, quindi quello che hai selezionato al posto di quello ... per favore rispondi
Madhur

@ Madhur guarda la risposta qui sotto
Jeremy Quinton

modifica la risposta e aggiungi "Questo metodo è ora deprecato nella 6.0. Invece di" body "usa" form_params ""
a828h

181

Poiché la risposta di Marco è deprecata , è necessario utilizzare la seguente sintassi (secondo il commento di 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',
    ]
]);

Richiedi con file 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'
        ]
    ]
]);

Utilizzo dei verbi REST con params

// 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');

Dati POST asincroni

Utile per lunghe operazioni sul server.

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

Imposta intestazioni

Secondo la documentazione , puoi impostare le intestazioni:

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

Ulteriori informazioni per il debug

Se desideri maggiori informazioni sui dettagli, puoi utilizzare debugun'opzione come questa:

$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 documentazione è più esplicita sulle nuove possibilità.


Come posso inviare una stringa di query nella richiesta di post?
Raheel

Cosa cerchi ? Se la stringa di query fa parte dell'URL, devi aggiungerla direttamente nell'URL come example.com/user/create?mode=dev " .
Samuel Dauzon

Sto cercando di inviare una richiesta di post a PayPal con dati codificati nell'URL. Penso che sia la chiave ["corpo"].
Raheel

Per inviare la stringa di query nelle richieste di post ho trovato meglio usare l'opzione 'query' all'interno dei parametri, perché in qualche modo nella stringa dell'URL
marcostvz

1
@ clockw0rk Ho aggiunto una parte delle intestazioni HTTP per te. Hai il link al documento
Samuel Dauzon

37

Nota in Guzzle V6.0 +, un'altra fonte di ottenere il seguente errore potrebbe essere l'uso non corretto di JSON come array:

Il passaggio dell'opzione di richiesta "body" come array per inviare una richiesta POST è stato deprecato. Utilizzare l'opzione di richiesta "form_params" per inviare una richiesta application / x-www-form-urlencoded, o un'opzione di richiesta "multipart" per inviare una richiesta multipart / form-data.

Errato :

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

Corretto :

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

Corretto :

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

Inserisci

openssl.cafilein php.inifile

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.