PHP GuzzleHttp. Как сделать почтовый запрос с параметрами?

104

Как сделать почтовый запрос с помощью 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 с сообщением «Ни один метод не может обработать ключ конфигурации электронной почты»

Арсен
источник

Ответы:

94

Попробуй это

$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
Этот метод объявлен устаревшим в версии 6.0. Вместо body используйте form_params.
jasonlfunk
5
Передача параметра запроса "body" в виде массива для отправки запроса POST устарела. Используйте параметр запроса form_params для отправки запроса application / x-www-form-urlencoded или параметр multipart для отправки запроса multipart / form-data.
Джереми Куинтон
@JeremyQuinton, так что вы выбрали Intead этого ... пожалуйста ответ
Мадхур
@madhur посмотрите ответ ниже
Джереми Куинтон
пожалуйста, отредактируйте ответ и добавьте к нему следующее: «Этот метод устарел в 6.0. Вместо body используйте form_params»
a828h
185

Поскольку ответ Марко устарел , вы должны использовать следующий синтаксис (согласно комментарию 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
]);

Документация более подробно описывает новые возможности.

Самуэль Даузон
источник
Как я могу отправить строку запроса в почтовом запросе?
Raheel
Что ты ищешь ? Если строка запроса является частью URL-адреса, вы должны добавить ее непосредственно в URL-адрес, например, example.com/user/create?mode=dev " .
Самуэль Дозон,
Я пытаюсь отправить почтовый запрос на PayPal с данными в кодировке url. Я думаю, это ключ ['body'].
Raheel
Для отправки строки запроса в почтовых запросах я нашел лучше использовать опцию 'query' внутри params, потому что почему-то в строке URL- адреса
marcostvz
1
@ clockw0rk Я добавил для вас часть заголовков HTTP. У вас есть ссылка на документ
Самуэль Дозон
37

Обратите внимание, что в Guzzle V6.0 + еще одним источником получения следующей ошибки может быть неправильное использование JSON в качестве массива:

Передача параметра запроса "body" в виде массива для отправки запроса POST устарела. Используйте опцию запроса form_params для отправки запроса application / x-www-form-urlencoded или опцию 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файле

Пракаш Д.
источник