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' => 'test@gmail.com',
        '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'

Respuestas:


92

Prueba esto

$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
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' => 'test@gmail.com',
        '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' => 'test@gmail.com',
        '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' => '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();
    }
);

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' => 'test@gmail.com',
        '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.


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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.