PHP GuzzleHttp。如何使用params进行发布请求?


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'

Answers:


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 2015年

5
不建议将“ body”请求选项作为数组发送来发送POST请求。请使用“ form_params”请求选项发送一个application / x-www-form-urlencoded请求,或者使用“ multipart”请求选项发送一个多部分/表单数据请求。
杰里米·昆顿

@JeremyQuinton,所以您选择的内容...请回复
Madhur

@madhur看看下面的答案
Jeremy Quinton

请编辑响应并添加“此方法在6.0中已弃用。”而不是'body'使用'form_params'“
a828h

181

由于Marco的答案已弃用,因此您必须使用以下语法(根据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
塞缪尔Dauzon

我正在尝试使用url编码数据向贝宝发送请求。我认为它的['body']键。
拉赫尔

为了在发布请求中发送查询字符串,我发现在参数中使用'query'选项会更好,因为以某种方式在url字符串中只使用了第一个docs.guzzlephp.org/en/latest/request-options.html#查询
marcostvz

1
@ clockw0rk我为您添加了HTTP标头部分。您已链接到文档
Samuel Dauzon

37

请注意,在Guzzle V6.0 +中,出现以下错误的另一个来源可能是不正确地将JSON用作数组:

不建议将“ body”请求选项作为数组发送来发送POST请求。请使用“ form_params”请求选项发送一个application / x-www-form-urlencoded请求,或者使用“ multipart”请求选项发送一个多部分/表单数据请求。

不正确

$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.cafilephp.ini文件中

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.