PHP GuzzleHttp. Como fazer um post request com params?

100

Como fazer uma solicitação de postagem com GuzzleHttp (versão 5.0).

Estou tentando fazer o seguinte:

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

Mas estou recebendo o erro:

Erro fatal do PHP: exceção não detectada 'InvalidArgumentException' com a mensagem 'Nenhum método pode manipular a chave de configuração de e-mail'

Arsen
fonte

Respostas:

92

Tente isto

$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
fonte
89
Este método agora está obsoleto no 6.0. Em vez de 'body' use 'form_params'.
jasonlfunk
5
A passagem da opção de solicitação "corpo" como uma matriz para enviar uma solicitação POST foi descontinuada. Use a opção de solicitação "form_params" para enviar uma solicitação application / x-www-form-urlencoded ou a opção de solicitação "multipart" para enviar uma solicitação multipart / form-data.
Jeremy Quinton
@JeremyQuinton, então o que você selecionou em vez disso ... por favor, responda
Madhur
@madhur veja a resposta abaixo
Jeremy Quinton
edite a resposta e adicione "Este método está obsoleto no 6.0. Em vez de 'body', use 'form_params'"
a828h
181

Como a resposta de Marco está obsoleta , você deve usar a seguinte sintaxe (de acordo com o comentário de 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',
    ]
]);

Solicitar com arquivos 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'
        ]
    ]
]);

Uso de verbos REST com parâmetros

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

Dados assíncronos de POST

Útil para longas operações de servidor.

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

Definir cabeçalhos

De acordo com a documentação , você pode definir cabeçalhos:

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

Mais informações para depuração

Se você quiser mais informações detalhadas, pode usar debugopções como esta:

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

A documentação é mais explícita sobre novas possibilidades.

Samuel Dauzon
fonte
Como posso enviar string de consulta na solicitação de postagem?
Raheel
O que procuras? Se a string de consulta for parte da URL, você deve adicioná-la diretamente à URL, como example.com/user/create?mode=dev " .
Samuel Dauzon
Estou tentando enviar uma solicitação de postagem ao paypal com dados codificados de url. Eu acho que é a chave ['corpo'].
Raheel
Para enviar string de consulta nas solicitações de postagem eu achei melhor usar a opção 'query' dentro dos parâmetros, porque de alguma forma na string de url ela pegou apenas a 1ª docs.guzzlephp.org/en/latest/request-options.html# consulta
marcostvz
1
@ clockw0rk adicionei uma parte de cabeçalhos HTTP para você. Você tem o link para o doc
Samuel Dauzon
37

Observação no Guzzle V6.0 +, outra fonte de obtenção do seguinte erro pode ser o uso incorreto de JSON como uma matriz:

A passagem da opção de solicitação "corpo" como uma matriz para enviar uma solicitação POST foi descontinuada. Use a opção de solicitação "form_params" para enviar uma solicitação application / x-www-form-urlencoded ou a opção de solicitação "multipart" para enviar uma solicitação multipart / form-data.

Incorreto :

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

Correto :

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

Correto :

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

Adicionar

openssl.cafileem php.iniarquivo

Prakash D
fonte