PHP GuzzleHttp. Як зробити запит на пошту з парами?


100

Як зробити запит на пошту за допомогою GuzzleHttp (версія 5.0).

Я намагаюся зробити наступне:

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

Але я отримую помилку:

Фатальна помилка PHP: Невизначений виняток "InvalidArgumentException" з повідомленням "Жоден метод не може обробити ключ конфігурації електронної пошти"

Відповіді:


92

Спробуйте це

$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
Цей метод тепер застарілий у 6.0. Замість 'body' використовуйте 'form_params'.
jasonlfunk

5
Передача опції "body" у вигляді масиву для надсилання запиту POST застаріла. Будь ласка, використовуйте параметр запиту "form_params", щоб надіслати заявку / x-www-form-urlencoded запит, або опцію "multipart" запиту, щоб надіслати запит багаточастинних / форм-даних.
Джеремі Кінтон

@JeremyQuinton, то що ви вибрали для цього ... будь ласка, відповідь
Мадхур,

@madhur дивіться на відповідь нижче
Джеремі Кінтон

будь ласка, відредагуйте відповідь та додайте це "Цей метод тепер застарілий у 6.0. Замість 'body' використовуйте 'form_params'" до нього
a828h

182

Оскільки відповідь Марко застаріла , ви повинні використовувати такий синтаксис (відповідно до коментаря 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',
    ]
]);

Запит з 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'
        ]
    ]
]);

Використання дієслів REST з парамами

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

Асинхронізувати дані POST

Корисна для тривалих операцій з сервером.

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

Встановити заголовки

Відповідно до документації , ви можете встановити заголовки:

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

Більше інформації для налагодження

Якщо ви хочете отримати детальну інформацію, ви можете скористатися таким debugваріантом:

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

Документація є більшим поясненням нових можливостей.


Як я можу надіслати рядок запиту в запиті на повідомлення?
Рахіль

Що ти шукаєш? Якщо рядок запиту є частиною URL-адреси, вам потрібно додати його безпосередньо в URL-адресу, наприклад example.com/user/create?mode=dev " .
Семюел Даузон,

Я намагаюся надіслати запит на пошту до paypal із кодованими даними url. Я думаю, що його ['body'] ключ.
Рахіль

Для надсилання рядка запиту в запитах на публікацію я знайшов краще, використовуючи опцію 'query' всередині параметрів, оскільки якимось чином у рядку url знадобився лише перший docs.guzzlephp.org/en/latest/request-options.html# запит
marcostvz

1
@ clockw0rk Я додав для вас частину заголовків HTTP. У вас є посилання на документ
Семюель Даузон,

37

Примітка у Guzzle V6.0 +, іншим джерелом отримання такої помилки може бути неправильне використання JSON як масиву:

Передача опції "body" у вигляді масиву для надсилання запиту POST застаріла. Будь ласка, використовуйте опцію запиту "form_params", щоб надіслати заявку / x-www-form-urlencoded request, або опцію "multipart", щоб надіслати запит multipart / form-data.

Неправильно :

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

Правильно :

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

Правильно :

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

Додайте

openssl.cafileу php.iniфайл

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.