PHP GuzzleHttp. Wie erstelle ich eine Post-Anfrage mit Params?


100

So stellen Sie eine Post-Anfrage mit GuzzleHttp (Version 5.0).

Ich versuche Folgendes zu tun:

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

Aber ich bekomme den Fehler:

Schwerwiegender PHP-Fehler: Nicht erfasste Ausnahme 'InvalidArgumentException' mit der Meldung 'Keine Methode kann den E-Mail-Konfigurationsschlüssel verarbeiten'.

Antworten:


92

Versuche dies

$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
Diese Methode ist jetzt in 6.0 veraltet. Verwenden Sie anstelle von 'body' 'form_params'.
Jasonlfunk

5
Die Übergabe der Anforderungsoption "body" als Array zum Senden einer POST-Anforderung ist veraltet. Verwenden Sie die Anforderungsoption "form_params", um eine Anwendung / x-www-form-urlencoded-Anforderung zu senden, oder die Anforderungsoption "multipart", um eine Anforderung "multipart / form-data" zu senden.
Jeremy Quinton

@ JeremyQuinton, also was Sie stattdessen ausgewählt haben ... bitte antworten Sie
Madhur

@ Madhur Blick auf die Antwort unten
Jeremy Quinton

Bitte bearbeiten Sie die Antwort und fügen Sie
Folgendes

180

Da die Antwort von Marco veraltet ist , müssen Sie die folgende Syntax verwenden (gemäß dem Kommentar von 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',
    ]
]);

Anfrage mit POST-Dateien

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

Verwendung von REST-Verben mit Parametern

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

Asynchrone POST-Daten

Nützlich für lange Serveroperationen.

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

Weitere Informationen zum Debuggen

Wenn Sie weitere Informationen benötigen, können Sie die folgende debugOption verwenden:

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

Die Dokumentation ist expliziter über neue Möglichkeiten.


Wie kann ich eine Abfragezeichenfolge in einer Post-Anfrage senden?
Raheel

Was suchst du ? Wenn die Abfragezeichenfolge Teil der URL ist, müssen Sie sie direkt in die URL wie example.com/user/create?mode=dev "
einfügen

Ich versuche, eine Post-Anfrage mit URL-codierten Daten an Paypal zu senden. Ich denke, sein ['Körper'] Schlüssel.
Raheel

Um eine Abfragezeichenfolge in den Post-Anfragen zu senden, habe ich die Option "Abfrage" in den Parametern besser verwendet, da in der URL-Zeichenfolge nur die erste docs.guzzlephp.org/en/latest/request-options.html# verwendet wurde. Abfrage
marcostvz

37

Beachten Sie, dass in Guzzle V6.0 + eine andere Ursache für den folgenden Fehler möglicherweise die falsche Verwendung von JSON als Array ist:

Die Übergabe der Anforderungsoption "body" als Array zum Senden einer POST-Anforderung ist veraltet. Verwenden Sie die Anforderungsoption "form_params", um eine Anwendung / x-www-form-urlencoded-Anforderung zu senden, oder die Anforderungsoption "multipart", um eine Anforderung "multipart / form-data" zu senden.

Falsch :

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

Richtig :

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

Richtig :

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

Hinzufügen

openssl.cafilein php.iniDatei

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.