PHP - Envío de array JSON en CURLOPT_POSTFIELDS a WebService

 
Vista:
sin imagen de perfil

Envío de array JSON en CURLOPT_POSTFIELDS a WebService

Publicado por José Manuel (3 intervenciones) el 24/05/2023 10:31:06
Hola. Estoy intentando enviar los valores de un formulario a través de cURL, y después de varias pruebas no consigo que lleguen los valores. Necesito enviar en CURLOPT_POSTFIELDS un array con dos elementos, uno es una cadena de texto y el otro es un JSON con los valores del formulario.

El código que estoy probando es muy sencillo pero por algún motivo no funciona y no se reciben los datos en el destinatario. Este es el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$nombre = $fields["nombre"];
$apellidos = $fields["apellidos"];
 
$dataForm = array(
    'Nombre' => $nombre,
    'Apellidos' => $apellidos
);
 
$campos = json_encode($dataForm);
 
$parametros = array(
  "action" => "addJSON",
  "content" => $campos);
 
$curl = curl_init();
 
curl_setopt_array($curl, array(
    CURLOPT_URL => 'pagina.php',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS => $parametros
  ));
 
$response = curl_exec($curl);
 
curl_close($curl);

Algo se me está escapando y no consigo averiguar qué.

Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 393
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Envío de array JSON en CURLOPT_POSTFIELDS a WebService

Publicado por Jefferson (203 intervenciones) el 26/05/2023 21:43:20
Hola Jose Manuel

Aparte de estar mal escrito el armado de tu curl, cuando se establece la pagina de destino
1
CURLOPT_URL => 'pagina.php',
Es necesario pasarle la dirección url completa, para que curl interprete una ip lógica. (aunque tu error, al estar en el mismo hosting no es el problema que tienes)

La manera correcta de enviar post mediante curl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$url = 'https://tudominio.com/pagina.php';
$data = array(
    "action" => "addJSON",
    'nombre' => 'Juan',
    'apellido' => 'Perez'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if(curl_errno($ch)) {
  echo 'Error: ' . curl_error($ch);
}
curl_close($ch);
echo $response;

y en la pagina.php
1
2
3
4
5
6
7
8
if(isset($_POST)){
    $action = $_POST['action'];
    $nombre = $_POST['nombre'];
    $apellido = $_POST['apellido'];
    echo "Hola, <b>$nombre $apellido</b>! la accion es <b>$action</b>";
} else {
    echo "No se recibieron los datos.";
}

Un saludo, espero te ayude.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Envío de array JSON en CURLOPT_POSTFIELDS a WebService

Publicado por José Manuel (3 intervenciones) el 26/05/2023 22:33:39
Muchas gracias por tu respuesta!

En cuanto a la URL "pagina.php" he puesto eso como ejemplo, por omitir la URL real, pero en mi código está completa.

En cuanto al código de "pagina.php" se trata de un código de terceros, creado por otros profesionales, al que no tengo acceso ni opción de modificar porque así lo han programado. Las indicaciones que me han dado es que deben llegar dos campos, uno cuyo valor es una cadena y otro cuyo valor es un array, en este caso un JSON con los valores del formulario (nombre, apellidos, etc...)

Por este motivo mi código está así:

1
2
3
$parametros = array(
  "action" => "addJSON",
  "content" => $campos);

Al final debería enviarse algo así:

1
2
3
4
5
6
$parametros = array(
    'action' => 'addJSON',
    'content' => '{
          "Nombre": "el nombre",
          "Apellidos": "el apellido"}'
);

Otra duda que surge ahora es si con la variable $parametros anterior se va a poder generar una cadena valida con "http_build_query".

Gracias por tu tiempo! :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 393
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Envío de array JSON en CURLOPT_POSTFIELDS a WebService

Publicado por Jefferson (203 intervenciones) el 27/05/2023 01:52:29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$url = 'https://tudominio.com/pagina.php';
$data = array(
  "action" => "addJSON",
  "content" => array(
    'nombre' => 'Juan',
    'apellido' => 'Perez'
  )
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = json_decode(curl_exec($ch), true);
if (curl_errno($ch)) {
  echo 'Error: ' . curl_error($ch);
}
curl_close($ch);
foreach ($response as $key => $value) {
  if (is_array($value)) {
      echo "$key:<br>";
      foreach ($value as $subkey => $subvalue) {
          echo "&nbsp;&nbsp;&nbsp;$subkey: $subvalue<br>";
      }
  } else {
      echo "$key: $value<br>";
  }
}

y en pagina.php
1
2
3
4
5
if(isset($_POST)){
     echo json_encode($_POST,true);
} else {
    echo "No se recibieron los datos.";
}

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Envío de array JSON en CURLOPT_POSTFIELDS a WebService

Publicado por José Manuel (3 intervenciones) el 29/05/2023 19:08:44
Finalmente el problema está resuelto, se trataba de un problema de codificación de los campos enviados y que el destinatario no era capaz de interpretar. En cualquier caso, gracias por vuestra ayuda! :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar