PHP GuzzleHttp. Jak złożyć wniosek o wpis z parametrami?

103

Jak wysłać żądanie wpisu za pomocą GuzzleHttp (wersja 5.0).

Próbuję wykonać następujące czynności:

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

Ale otrzymuję błąd:

Błąd krytyczny PHP: nieprzechwycony wyjątek „InvalidArgumentException” z komunikatem „Żadna metoda nie obsługuje klucza konfiguracji poczty e-mail”

Arsen
źródło

Odpowiedzi:

94

Spróbuj tego

$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
źródło
90
Ta metoda jest obecnie przestarzała w wersji 6.0. Zamiast „body” użyj „form_params”.
jasonlfunk
5
Przekazywanie opcji żądania „body” jako tablicy do wysyłania żądania POST jest przestarzałe. Użyj opcji żądania „form_params”, aby wysłać żądanie application / x-www-form-urlencoded, lub opcji żądania „multipart”, aby wysłać żądanie multipart / form-data.
Jeremy Quinton
@JeremyQuinton, więc to, co wybrałeś, dotyczy tego ... proszę o odpowiedź
Madhur
@madhur spójrz na odpowiedź poniżej
Jeremy Quinton
edytuj odpowiedź i dodaj to „Ta metoda jest obecnie przestarzała w wersji 6.0. Zamiast„ body ”użyj„ form_params ””
a828h
184

Ponieważ odpowiedź Marco jest przestarzała , musisz użyć następującej składni (zgodnie z komentarzem 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',
    ]
]);

Żądaj z plikami 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'
        ]
    ]
]);

Użycie czasowników REST z parametrami

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

Asynchroniczne dane POST

Przydatne do długich operacji na serwerze.

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

Ustaw nagłówki

Zgodnie z dokumentacją możesz ustawić nagłówki:

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

Więcej informacji na temat debugowania

Jeśli chcesz uzyskać więcej informacji, możesz skorzystać z debugtakiej opcji:

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

Dokumentacja bardziej wyjaśnia nowe możliwości.

Samuel Dauzon
źródło
Jak mogę wysłać ciąg zapytania w żądaniu pocztowym?
Raheel
Czego szukasz ? Jeśli ciąg zapytania jest częścią adresu URL, musisz dodać go bezpośrednio w adresie URL, na przykład example.com/user/create?mode=dev " .
Samuel Dauzon
Próbuję wysłać żądanie pocztowe do systemu PayPal z danymi zakodowanymi w adresie URL. Myślę, że to klucz [„body”].
Raheel
Aby wysłać ciąg zapytania w żądaniach postów, uważam, że lepiej jest użyć opcji „zapytanie” wewnątrz parametrów, ponieważ w jakiś sposób w ciągu adresu
marcostvz
1
@ clockw0rk Dodałem dla ciebie część nagłówków HTTP. Masz link do dokumentu
Samuel Dauzon
37

Uwaga w Guzzle V6.0 +, innym źródłem otrzymywania następującego błędu może być nieprawidłowe użycie JSON jako tablicy:

Przekazywanie opcji żądania „body” jako tablicy do wysyłania żądania POST jest przestarzałe. Użyj opcji żądania „form_params”, aby wysłać żądanie application / x-www-form-urlencoded, lub opcji żądania „multipart”, aby wysłać żądanie multipart / form-data.

Niepoprawnie :

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

Poprawnie :

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

Poprawnie :

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

Dodaj

openssl.cafilew php.inipliku

Prakash D
źródło