votación - Lectura de JSON POST usando PHP
recibir json en php post (3)
Hola, este es un fragmento de un antiguo proyecto mío que utiliza curl para obtener información sobre IP de algunos servicios de bases de datos ip gratuitas que responden en formato json. Creo que podría ayudarte.
$ip_srv = array("http://freegeoip.net/json/$this->ip","http://smart-ip.net/geoip-json/$this->ip");
getUserLocation($ip_srv);
Función:
function getUserLocation($services) {
$ctx = stream_context_create(array(''http'' => array(''timeout'' => 15))); // 15 seconds timeout
for ($i = 0; $i < count($services); $i++) {
// Configuring curl options
$options = array (
CURLOPT_RETURNTRANSFER => true, // return web page
//CURLOPT_HEADER => false, // don''t return headers
CURLOPT_HTTPHEADER => array(''Content-type: application/json''),
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle compressed
CURLOPT_USERAGENT => "test", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 5, // timeout on connect
CURLOPT_TIMEOUT => 5, // timeout on response
CURLOPT_MAXREDIRS => 10 // stop after 10 redirects
);
// Initializing curl
$ch = curl_init($services[$i]);
curl_setopt_array ( $ch, $options );
$content = curl_exec ( $ch );
$err = curl_errno ( $ch );
$errmsg = curl_error ( $ch );
$header = curl_getinfo ( $ch );
$httpCode = curl_getinfo ( $ch, CURLINFO_HTTP_CODE );
curl_close ( $ch );
//echo ''service: '' . $services[$i] . ''</br>'';
//echo ''err: ''.$err.''</br>'';
//echo ''errmsg: ''.$errmsg.''</br>'';
//echo ''httpCode: ''.$httpCode.''</br>'';
//print_r($header);
//print_r(json_decode($content, true));
if ($err == 0 && $httpCode == 200 && $header[''download_content_length''] > 0) {
return json_decode($content, true);
}
}
}
Miré a mi alrededor mucho antes de publicar esta pregunta, así que mis disculpas si está en otra publicación y esta es solo mi segunda pregunta aquí, así que me disculpo si no formateo esta pregunta correctamente.
Tengo un servicio web realmente simple que he creado que necesita tomar valores de publicaciones y devolver una matriz codificada JSON. Todo funcionó bien hasta que me dijeron que tendría que publicar los datos del formulario con un tipo de contenido de aplicación / json. Desde entonces no puedo devolver ningún valor del servicio web y definitivamente tiene que ver con la forma en que estoy filtrando sus valores de publicación.
Básicamente, en mi configuración local, he creado una página de prueba que hace lo siguiente:
$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
''Content-Type: application/json'',
''Content-Length: '' . strlen($data))
);
curl_setopt($curl, CURLOPT_URL, ''http://webservice.local/''); // Set the url path we want to call
$result = curl_exec($curl);
//see the results
$json=json_decode($result,true);
curl_close($curl);
print_r($json);
En el servicio web tengo esto (he eliminado algunas de las funciones) -
<?php
header(''Content-type: application/json'');
/* connect to the db */
$link = mysql_connect(''localhost'',''root'',''root'') or die(''Cannot connect to the DB'');
mysql_select_db(''webservice'',$link) or die(''Cannot select the DB'');
if(isset($_POST[''action'']) && $_POST[''action''] == ''login'') {
$statusCode = array(''statusCode''=>1, ''statusDescription''=>''Login Process - Fail'');
$posts[] = array(''status''=>$statusCode);
header(''Content-type: application/json'');
echo json_encode($posts);
/* disconnect from the db */
}
@mysql_close($link);
?>
Básicamente, sé que se debe a que los valores de $ _POST no se han establecido, pero no puedo encontrar lo que necesito poner en lugar del $ _POST. Intenté json_decode ($ _ POST), file_get_contents ("php: // input") y varias otras formas, pero estaba filmando en la oscuridad un poco.
Cualquier ayuda sería muy apreciada.
Gracias, Steve
Gracias a Michael por la ayuda, eso fue un paso adelante definitivo. Ahora al menos tengo una respuesta cuando hago eco del mensaje ... incluso si es nulo.
CURL actualizado -
$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, array(''Content-Type: application/json''));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_URL, ''http://webservice.local/'');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
php actualizado en la página en la que se publican los datos:
$inputJSON = file_get_contents(''php://input'');
$input= json_decode( $inputJSON, TRUE ); //convert JSON into array
print_r(json_encode($input));
Como digo al menos veo una respuesta ahora cuando antes estaba devolviendo una página en blanco
Tienes $_POST
vacío. Si su servidor web quiere ver datos en formato json, necesita leer la entrada en bruto y luego analizarla con decodificación JSON.
Necesitas algo como eso:
$json = file_get_contents(''php://input'');
$obj = json_decode($json);
También tiene un código incorrecto para probar la comunicación JSON ...
CURLOPT_POSTFIELDS
le dice a curl
que codifique sus parámetros como application/x-www-form-urlencoded
. Necesitas cadena JSON aquí.
ACTUALIZAR
Su código php para la página de prueba debería ser así:
$data_string = json_encode($data);
$ch = curl_init(''http://webservice.local/'');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
''Content-Type: application/json'',
''Content-Length: '' . strlen($data_string))
);
$result = curl_exec($ch);
$result = json_decode($result);
var_dump($result);
También en su página de servicio web debe eliminar uno de los header(''Content-type: application/json'');
línea header(''Content-type: application/json'');
. Debe ser llamado solo una vez.
puedes poner tu json en un parámetro y enviarlo en lugar de poner solo tu json en el encabezado:
$post_string= ''json_param='' . json_encode($data);
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $post_string);
curl_setopt($curl, CURLOPT_URL, ''http://webservice.local/''); // Set the url path we want to call
//execute post
$result = curl_exec($curl);
//see the results
$json=json_decode($result,true);
curl_close($curl);
print_r($json);
en el lado del servicio puede obtener su cadena json como parámetro:
$json_string = $_POST[''json_param''];
$obj = json_decode($json_string);
entonces puedes usar tus datos convertidos como objeto.