PHP GuzzleHttp. ¿Cómo hacer una solicitud de publicación con params?

100

Cómo realizar una solicitud de publicación con GuzzleHttp (versión 5.0).

Estoy intentando hacer lo siguiente:

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

Pero recibo el error:

Error fatal de PHP: excepción no detectada 'InvalidArgumentException' con el mensaje 'Ningún método puede manejar la clave de configuración de correo electrónico'

Arsen
fuente

Respuestas:

92

Prueba esto

$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
fuente
89
Este método ahora está obsoleto en 6.0. En lugar de "cuerpo", utilice "form_params".
jasonlfunk
5
Pasar la opción de solicitud "cuerpo" como una matriz para enviar una solicitud POST ha quedado obsoleto. Utilice la opción de solicitud "form_params" para enviar una solicitud application / x-www-form-urlencoded, o la opción de solicitud "multipart" para enviar una solicitud multipart / form-data.
Jeremy Quinton
@JeremyQuinton, así que lo que ha seleccionado en lugar de eso ... por favor responda
Madhur
@madhur mira la respuesta a continuación
Jeremy Quinton
edite la respuesta y agregue esto "Este método ahora está obsoleto en 6.0. En lugar de 'body', use 'form_params'"
a828h
181

Dado que la respuesta de Marco está en desuso , debe usar la siguiente sintaxis (de acuerdo con el comentario 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 con archivos 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 los verbos REST con params

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

Datos POST asíncronos

Útil para operaciones de servidor largas.

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

Establecer encabezados

Según la documentación , puede establecer encabezados:

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

Más información para depurar

Si desea obtener más información detallada, puede usar una debugopción 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
]);

La documentación es más explícita sobre nuevas posibilidades.

Samuel Dauzon
fuente
¿Cómo puedo enviar una cadena de consulta en una solicitud de publicación?
Raheel
Que es lo que busca ? Si la cadena de consulta es parte de la URL, debe agregarla directamente en la URL como example.com/user/create?mode=dev " .
Samuel Dauzon
Estoy tratando de enviar una solicitud de publicación a PayPal con datos codificados en URL. Creo que es la clave ['cuerpo'].
Raheel
Para enviar una cadena de consulta en las solicitudes de publicación, he encontrado que es mejor usar la opción 'consulta' dentro de los parámetros, porque de alguna manera en la cadena de la URL solo tomó la primera docs.guzzlephp.org/en/latest/request-options.html# consulta
marcostvz
1
@ clockw0rk Agregué una parte de encabezados HTTP para ti. Tienes el enlace al documento
Samuel Dauzon
37

Tenga en cuenta que en Guzzle V6.0 +, otra fuente de obtener el siguiente error puede ser el uso incorrecto de JSON como una matriz:

Pasar la opción de solicitud "cuerpo" como una matriz para enviar una solicitud POST ha quedado obsoleto. Utilice la opción de solicitud "form_params" para enviar una solicitud application / x-www-form-urlencoded, o la opción de solicitud "multipart" para enviar una solicitud multipart / form-data.

Incorrecto :

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

Correcto :

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

Correcto :

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

Añadir

openssl.cafileen php.iniarchivo

Prakash D
fuente