PHP-GuzzleHttp。如何使用params发出post请求?

PHP-GuzzleHttp。如何使用params发出post请求?,php,request,httpclient,guzzle,Php,Request,Httpclient,Guzzle,如何使用GuzzleHttp(5.0版)发出post请求 我正在努力做到以下几点: $client = new \GuzzleHttp\Client(); $client->post( 'http://www.example.com/user/create', array( 'email' => 'test@gmail.com', 'name' => 'Test user', 'password' => 't

如何使用GuzzleHttp(5.0版)发出post请求

我正在努力做到以下几点:

$client = new \GuzzleHttp\Client();
$client->post(
    'http://www.example.com/user/create',
    array(
        'email' => 'test@gmail.com',
        'name' => 'Test user',
        'password' => 'testpassword'
    )
);
但我得到了一个错误:

PHP致命错误:未捕获异常“InvalidArgumentException”,消息为“没有方法可以处理电子邮件配置键”

试试这个

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

由于Marco的答案不受欢迎,因此必须使用以下语法(根据jasonlfunk的评论):

使用POST文件请求 带params的REST动词用法 异步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
]);

更多关于新可能性的说明。

注意,在Guzzle V6.0+中,另一个导致以下错误的原因可能是不正确地使用JSON作为数组:

将“body”请求选项作为数组传递以发送帖子 请求已被否决。请使用“表格参数”请求 发送应用程序/x-www-form-urlencoded请求的选项,或 “多部分”请求选项,用于发送多部分/表单数据请求

不正确

$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',
    ])
])
正确

$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',
    ])
])
正确

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


openssl.cafile
php.ini
文件中

此方法现在在6.0中被弃用。不使用“body”而使用“form_params”。不推荐将“body”请求选项作为数组传递以发送POST请求。请使用“form_params”请求选项发送应用程序/x-www-form-urlencoded请求,或使用“multipart”请求选项发送多部分/表单数据请求。@JeremyQuinton,那么您选择的intead…请reply@madhur查看下面的答案,请编辑响应并添加此选项“此方法现在在6.0中被弃用。不要使用“body”而使用“form_params”“to i如何在post请求中发送查询字符串?您在寻找什么?如果查询字符串是URL的一部分,您必须直接将其添加到URL中,如”。我正在尝试使用URL编码的数据向paypal发送post请求。我认为它是['body']键。为了在post请求中发送查询字符串,我发现在参数中使用'query'选项更好,因为不知怎的,在url字符串中只使用了第一个@clockw0rk,我为您添加了一个HTTP头部分。你有这个文件的链接