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

5 minutos de lectura

avatar de usuario
Arsen

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

Estoy tratando de 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 estoy recibiendo 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’

avatar de usuario
samuel dauzon

Ya que La respuesta de Marco está en desuso.debe usar la siguiente sintaxis (según 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',
    ]
]);

Solicitud 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 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

De acuerdo a documentaciónpuede 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 la depuración

Si desea más información detallada, puede utilizar debug opció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
]);

Documentación es más explícito sobre nuevas posibilidades.

  • ¿Cómo puedo enviar una cadena de consulta en una solicitud posterior?

    – Raheel

    30 de mayo de 2016 a las 7:23

  • Que es lo que busca ? Si la cadena de consulta es parte de la URL, debe agregarla directamente en la URL como ejemplo.com/user/create?mode=dev.

    – Samuel Dauzon

    30 de mayo de 2016 a las 7:26

  • Estoy tratando de enviar una solicitud de publicación a PayPal con datos codificados en URL. Creo que es [‘body’] llave.

    – Raheel

    30 de mayo de 2016 a las 7:46

  • Para enviar una cadena de consulta en las solicitudes de publicación, encontré que es mejor usar la opción ‘consulta’ dentro de los parámetros, porque de alguna manera en la cadena de URL solo tomó la primera docs.guzzlephp.org/en/latest/request-options.html#query

    – marcostvz

    22 de junio de 2016 a las 13:21


  • @clockw0rk Agregué una parte de encabezados HTTP para ti. Tienes el enlace al doc.

    – Samuel Dauzon

    17 de agosto de 2020 a las 23:40

avatar de usuario
marco

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

  • Este método ahora está en desuso en 6.0. En lugar de ‘cuerpo’, use ‘form_params’.

    – jasonfunk

    13 de agosto de 2015 a las 21:29


  • 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

    19 de enero de 2016 a las 16:38

  • @JeremyQuinton, lo que ha seleccionado en vez de eso… por favor responda

    – Madhur

    10 de agosto de 2017 a las 7:27

  • @madhur mira la respuesta a continuación

    –Jeremy Quinton

    11 de agosto de 2017 a las 18:25

  • edite la respuesta y agregue esto “Este método ahora está obsoleto en 6.0. En lugar de ‘cuerpo’ use ‘form_params'”

    – a828h

    12/04/2018 a las 13:40

avatar de usuario
scott yang

Tenga en cuenta que en Guzzle V6.0+, otra fuente de obtener el siguiente error puede ser el uso incorrecto de JSON como 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',
    ])
])

avatar de usuario
prakash d

$client = new \GuzzleHttp\Client();
$request = $client->post('http://demo.website.com/api', [
    'body' => json_encode($dataArray)
]);
$response = $request->getBody();

Agregar

openssl.cafile en php.ini expediente

Puede llamar fácilmente a Multipart Api para cargar imágenes directamente usando GuzzleHttp\Client;

use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Utils;
use File;

$filename = $req->file('file1')->getClientOriginalName();
        $getfilePath  = $req->file('file1')->getRealPath();
        $client = new Client();
$response = $client->request('POST', 'http://127.0.0.1:8045/api/uploadImages', [
    'multipart' => [
        [
            'name'     => 'image',
            'contents' => fopen($getfilePath, 'r')
        ],
        // 'headers'  => [
        //      'Content-Type' => '<Content-type header>'
        //  ]
       
    ]
]);
echo $response->getStatusCode();
$bodyresponcs = $response->getBody();
$result = json_decode($bodyresponcs);
print_r($result->status);

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad