JavaScript - Ayuda leer datos de webserver con json

   
Vista:
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo registro8815@hotmail.com (27 intervenciones) el 07/12/2015 12:24:12
Hola a todos

Soy totalmente nuevo en el JSON y tras mucho leer al final he conseguido hacer estas primeras pruebas, aunque los resultados no son los esperados, siempre me da error 202,"text":"Not valid JSON structure: Syntax error, malformed JSON

El propietario del webservice me indica lo siguiente

getSessionKey
Este método devuelve la variable session-key necesaria en el resto de las llamadas del webservice.
Parámetros de entrada:
email : Email con el que te diste de alta
passwd : Contraseña del usuario

Ejemplo de Json:
1
2
3
4
5
6
7
8
9
{
"user": "XXXXXXX",
"parameters": [
{
"email": "YYYY@YYYY.com",
"passwd": "ZZZZ"
}
],
}

Parámetros de salida:
session-key Identifcador único de sesión, necesario para todas las llamadas Web Service.

Ejemplo de Json:
1
2
3
4
5
6
7
8
{
"errors": [{"code": "0", "text": ""}],
"results": [
{
"session-key": "YYYYYYYYYYYYYYYYYYYYYYYYYY"
}
],
}

Visto estas indicaciones esto es lo que he realizado
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<?php
$data = http_build_query(
		array(
			'email' => 'email@mio.com',
			'passwd' => 'sakf79hdskfoj'
		)
	);
 
$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-Type: application/json',
        'content' => $data
    )
);
 
$context  = stream_context_create($opts);
 
$json_file = file_get_contents('http://proveedor.com/actions/servicioWS.php?method=getSessionKey', false, $context);
 
$jfo = json_decode($json_file);
 
$session = $jfo->result->session-key;
?>
 
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Ejemplo 4</title>
    <link rel="stylesheet" href="style.css" />
</head>
 
<body>
    <div class="container">
        <h1 class="main_title"><?php echo $session; ?></h1>
        <div class="content">
            <ul class="ul_json clearfix">
			<?php echo "sesion ", $session; ?><br/>
			<?php echo "data ",$data; ?><br/>
			<?php echo "opts ",$opts; ?><br/>
			<?php echo "context ", $context; ?><br/>
			<?php echo "jsonfile ", $json_file; ?><br/>
            </ul>
        </div><!-- content -->
    </div><!-- container -->
</body>
</html>

Con el siguiente resultado
sesion 0
data email=email%40mio.com&passwd=sakf79hdskfoj
opts Array
context Resource id #2
jsonfile {"errors":{"code":202,"text":"Not valid JSON structure: Syntax error, malformed JSON.."},"results":""}

Y tras tres dias, no consigo pasar de ahi, siempre error en sintaxis del json,

Otras pruebas realizadas y con mismo resultado son asi
EJEMPLO 3
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script type="text/javascript">
$.ajax({
    data: {"email": "email@mio.com","passwd": "slkjfi93flsld"},
    type: "POST",
    dataType: "json",
    url: "http://proveedor.com/actions/servicioWS.php?method=getSessionKey",
})
 .done(function(data, textStatus, session-key) {
     if ( console && console.log ) {
         console.log( "La solicitud se ha completado correctamente." );
     }
 })
 .fail(function(session-key, textStatus, errorThrown) {
     if ( console && console.log ) {
         console.log( "La solicitud a fallado: " +  textStatus );
     }
});
 
var $session-key = {console.log(session-key)}
var $textStatus = textStatus
</script>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Ejemplo 3</title>
    <link rel="stylesheet" href="style.css" />
</head>
 
<body>
    <div class="container">
        <h1 class="main_title"><?php echo $session-key; ?></h1>
        <div class="content">
            <ul class="ul_json clearfix">
 
			<?php echo "sesionkey ",$session-key; ?><br/>
			<?php echo "textStatus ",$textStatus; ?>
 
            </ul>
        </div><!-- content -->
    </div><!-- container -->
</body>
</html>

Ha llegado el momento en el que ya no puedo continuar solo, y por eso os pregunto

¿Cual de los dos ejemplos es mas correcto?
¿Donde esta el error en el envío de los datos para que siempre me de 202?

Gracias a todos de antemano
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
Imágen de perfil de Jordi

Ayuda leer datos de webserver con json

Publicado por Jordi (75 intervenciones) el 07/12/2015 14:18:02
Hola Juanjo,
¿Podrías ponernos un ejemplo del JSON final que te produce el error, con alguna traza? Probablemente resulte más sencillo identificar el fallo porque se estará construyendo correctamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 07/12/2015 14:46:47
Solo tengo la información que me paso el proveedor y que es la que muestro al principio,

Detallo aqui:

Parametros de entrada
Lo primero que tendremos en cuenta es que el formato de intercambio de datos es JSON, por lo que la información enviada y recibida deberá ser de tipo application/json.

En cada llamada el nombre del método deberá indicarse en la url con el parámetro method.

La estructura JSON se enviará necesariamente por POST y deberá contener los siguientes campos obligatorios:
user Identifcador de usuario en proveedor.com
parameters Array de parámetros específcos de cada método, puede ser un array vacío, pero ha de enviarse siempre. Consultar el apartado Parametros de entrada en cada método getSessionKey.
session-key* Identifcador de session, se obtiene a través del método (Esto es lo primero que tengo que obtener antes de seguir y es para lo que he realizado el ejemplo de arriba)
signature* Firma digital que se obtiene a partir del campo parameters y session-key, se explica como obtenerlo en obtención del
parámetro signature. (Esto por ahora no es obligatorio)

Despues de esta información, pasa a indicarme como conseguir el getSessionKey

getSessionKey
Este método devuelve la variable session-key necesaria en el resto de las llamadas del webservice.
Parámetros de entrada:
email : Email con el que te diste de alta
passwd : Contraseña del usuario

Este método es el único que no requiere los parámetros session-key y signature

Ejemplo de Json: (esta todo especificado arriba)

Los Json de entrada y salida están especificados arriba
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
Imágen de perfil de Jordi

Ayuda leer datos de webserver con json

Publicado por Jordi (75 intervenciones) el 07/12/2015 14:56:57
¿Has probado a hacer un JSON encode tras crear el array de entrada y antes de enviarlo? Porque por lo que parece no se lo estás mandando en formato JSON.

1
$context  = json_encode($opts);

Documentación: http://www.php.net/manual/en/function.json-encode.php
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 07/12/2015 15:06:07
Resultado tras sustituir $context = stream_context_create($opts); por $context = json_encode($opts);
Warning: file_get_contents() expects parameter 3 to be resource, string given in /home/u648256038/public_html/parse/4.php on line 20

sesion: 0
data: email=email%40mio.com&passwd=sdkjflsdjofe
opts: Array
context : {"http":{"method":"POST","header":"Content-Type: application\/json","content":"email=email%40mio.com&passwd=sdkjflsdjofe"}}
jsonfile (no muestra nada aqui)

Tras el Warning, he modificado la linea 20 dejandola asi
1
$json_file = file_get_contents('http://miproveedor.com/actions/servicioWS.php?method=getSessionKey', $context);
y este es el resultado
sesion: 0
data: email=email%40mio.com&passwd=sdkjflsdjofe
opts: Array
context: {"http":{"method":"POST","header":"Content-Type: application\/json","content":"email=email%40mio.com&passwd=sdkjflsdjofe"}}
jsonfile: {"errors":{"code":201,"text":"Invalid JSON: user field is required."},"results":""}
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
Imágen de perfil de Jordi

Ayuda leer datos de webserver con json

Publicado por Jordi (75 intervenciones) el 07/12/2015 15:20:38
Estoy viendo que lo que tienes que mandar es un JSON con "user" y "parameters". Dentro de parameters es donde tienes que meter el array de email y password, que es lo único que ahora estás pasando. Es decir, tienes que crear un json con el usuario (que ahora no se está haciendo) y el array que estás creando actualmente como atributo "parameters", en vez de pasar directamente el json que estás pasando ahora.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 07/12/2015 15:26:48
Eso estaba ahora probando, pero creo que no lo estoy haciendo bien, te pongo como he modificado el data

Basandome en su json de salida
1
2
3
4
5
6
7
8
9
{
"user": "XXXXXXX",
"parameters": [
{
"email": "YYYY@YYYY.com",
"passwd": "ZZZZ"
}
],
}

Este es el $data

1
2
3
4
5
6
7
8
9
$data = http_build_query(
		array(
		'user'=> '158874',
		'parameters'=> [
			'email' => 'email@mio.com',
			'passwd' => 'alsjasldfkjasl'
			],
		)
	);

Resultado

sesion 0
data: user=150183¶meters%5Bemail%5D=email%40mio.com¶meters%5Bpasswd%5D=laskjdfojoe
opts: Array
context: {"http":{"method":"POST","header":"Content-Type: application\/json","content":"user=158874¶meters%5Bemail%5D=email%40mio.com¶meters%5Bpasswd%5D=aslkfjdlso"}}
jsonfile: {"errors":{"code":201,"text":"Invalid JSON: user field is required."},"results":""}
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
Imágen de perfil de Jordi

Ayuda leer datos de webserver con json

Publicado por Jordi (75 intervenciones) el 07/12/2015 15:36:48
Ahora no estás creando el JSON de dentro del atributo "parameters". Es decir, deberías crear un JSON solo de email y password y una vez creado y con el json_encode hecho, deberías crear el JSON superior, pasando como atributo "parameters" un array de una posición, conteniendo el json de email y password que has creado.

1
2
3
4
5
6
$data = http_build_query(
		array(
		'user'=> '158874',
		'parameters'=> [$jsonEmailPassword],
		)
	);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 07/12/2015 16:25:49
Jordi he seguido tus indicaciones y con mis pocos conocimientos entiendo que quieres que haga esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
$emailpass = array(
			'email' => 'email@mio.com',
			'passwd' => 'lksjdfojeljf'
		);
 
$jsonemailpass  = json_encode($emailpass);
 
$data = http_build_query(
		array(
		'user'=> '158874',
		'parameters'=> [$jsonemailpass],
		)
	);

Pero el resultado es el siguiente: (incluyo nuevas variables)

EMAILPASS : Array
JSONEMAILPASS : {"email":"email@mio.com","passwd":"skjlfjalsf"}
SESION : 0
DATA : user=150183¶meters%5B0%5D=%7B%22email%22%3A%22email%40mio.com%22%2C%22passwd%22%3A%22qskjlfjalsf%22%7D
OPTS : Array
CONTEXT : {"http":{"method":"POST","header":"Content-Type: application\/json","content":"user=150183¶meters%5B0%5D=%7B%22email%22%3A%22email%40mio.com%22%2C%22passwd%22%3A%22skjlfjalsf%22%7D"}}
JSONFILE {"errors":{"code":201,"text":"Invalid JSON: user field is required."},"results":""}
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
Imágen de perfil de Jordi

Ayuda leer datos de webserver con json

Publicado por Jordi (75 intervenciones) el 07/12/2015 17:18:27
Fíjate en que $jsonemailpass está montado correctamente. Por tanto, el otro json lo tienes que montar de la misma manera, haciéndole otro json_encode antes de montar la http_query. Es decir, te debería de quedar algo así:

1
2
3
4
5
6
7
8
9
10
11
$emailpass = array(
			'email' => 'email@mio.com',
			'passwd' => 'lksjdfojeljf'
		);
$jsonemailpass  = json_encode($emailpass);
$entrada = array(
		'user'=> '158874',
		'parameters'=> [$jsonemailpass],
		);
$jsonentrada = json_encode($entrada); // El array entero se vuelve a convertir a json
$data = http_build_query($jsonentrada);
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
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 07/12/2015 20:23:48
Warning: http_build_query(): Parameter 1 expected to be Array or Object. Incorrect value given in /home/u648256038/public_html/parse/4.php on line 17

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
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<?php
 
$emailpass = array(
			'email' => 'email@mio.com',
			'passwd' => 'lksajfoejld'
		);
 
$jsonemailpass  = json_encode($emailpass);
 
$entrada = array(
		'user'=> '151543',
		'parameters'=> [$jsonemailpass],
		);
 
$jsonentrada = json_encode($entrada);
$data = http_build_query($jsonentrada);
 
$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-Type: application/json',
        'content' => $data
    )
);

Una pregunta, la coma que hay despues de 'parameters'=> [$jsonemailpass], ¿es necesaria? He probado quitarsela y da el mismo error, pero puesto que no hay mas campos despues, a mi entender no tendría que estar ahi.
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
Imágen de perfil de xve

Ayuda leer datos de webserver con json

Publicado por xve (1595 intervenciones) el 07/12/2015 20:53:37
La coma, no tendría que ir, aunque el error que te da no es ese... te indica que espera un objeto o un array...

Prueba así:
1
'parameters'=> $jsonemailpass

Coméntanos, ok?
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
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 07/12/2015 21:59:17
Hola xve

Ya había probado 'parameters'=> $jsonemailpass y tambien 'parameters'=> ($jsonemailpass)

con y sin coma, pero siempre el mismo error, de esa linea no pasa

Warning: http_build_query(): Parameter 1 expected to be Array or Object. Incorrect value given in /home/u648256038/public_html/parse/4.php on line 17
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
Imágen de perfil de Jordi

Ayuda leer datos de webserver con json

Publicado por Jordi (75 intervenciones) el 08/12/2015 00:36:01
Échale un vistazo a este post de Stackoverflow en el que se habla de enviar JSON por POST usando PHP:
http://stackoverflow.com/questions/6213509/send-json-post-using-php

Primero, antes de enviar, haz un echo de $jsonentrada para ver que efectivamente coincide con tu modelo de datos de entrada.
Después puedes probar esto para enviarlo, sustituyendo el http_build_query().

1
2
$client = new Zend_Http_Client($tuDireccionURL);
$client->setRawData($jsonentrada, 'application/json')->request('POST');
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
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 08/12/2015 05:02:52
Hola Jordi

Ya había visto ese post con anterioridad, pero remite a otro enlace que esta roto, por eso lo descarte.

En el codigo completo indicado en la parte superior, muestro los echo que tengo para visualizar todas las variables que se van creando, antes de probar las anotaciones tuyas, te indico los resultados de los echo

1
2
3
4
5
6
7
EMAILPASS : Array
JSONEMAILPASS : {"email":"email@mio.com","passwd":"lskjfoewjf"}
SESION : 0
DATA :
OPTS : Array
CONTEXT : {"http":{"method":"POST","header":"Content-Type: application\/json","content":false}}
JSONFILE {"errors":{"code":201,"text":"Invalid JSON: user field is required."},"results":""}

Pero tras introducir tu codigo (creo entender que querias que lo probase asi)

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
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<?php
 
$emailpass = array(
			'email' => 'email@mio.com',
			'passwd' => 'alksjflasdjfl'
		);
 
$jsonemailpass = json_encode($emailpass);
 
$entrada = array(
		'user' => '151583',
		'parameters' => [$jsonemailpass]
		);
 
$jsonentrada = json_encode($entrada);
 
$tuDireccionURL = 'http://proveedor.com/actions/servicioWS.php?method=getSessionKey';
 
$client = new Zend_Http_Client($tuDireccionURL);
$client->setRawData($jsonentrada, 'application/json')->request('POST');
 
$jfo = json_decode($json_file);
 
$session = $jfo->result->session-key;

El resultado es Fatal error: Class 'Zend_Http_Client' not found in /home/u648256038/public_html/parse/4.php on line 20

Por lo que no llego a ver los echo
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
Imágen de perfil de xve

Ayuda leer datos de webserver con json

Publicado por xve (1595 intervenciones) el 08/12/2015 08:13:55
Exactamente que contiene la variable $jsonentrada??

Muestranos el resultado de:
1
echo $jsonentrada;
y
1
print_r($jsonentrada);

Así sabremos exactamente que contenido tiene...
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
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 08/12/2015 12:00:54
1
2
3
4
5
6
7
8
JSONENTRADA : {"user":"155883","parameters":["{\"email\":\"email@mio.com\",\"passwd\":\"alksjflsfjeo\"}"]}
EMAILPASS : Array
JSONEMAILPASS : {"email":"email@mio.com","passwd":"askjdflasdjfla"}
SESION : 0
DATA :
OPTS : Array
CONTEXT : {"http":{"method":"POST","header":"Content-Type: application\/json","content":false}}
JSONFILE {"errors":{"code":201,"text":"Invalid JSON: user field is required."},"results":""}

Por cierto al comentar la linea
1
//$client = new Zend_Http_Client($tuDireccionURL);

y al llegar a la siguiente linea
1
$client->setRawData($jsonentrada, 'application/json')->request('POST');

Fatal error: Call to a member function setRawData() on a non-object in /home/u648256038/public_html/parse/4.php on line 22

He de suponer que es por que le falta la url, pero aun asi quise indicaroslo
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
Imágen de perfil de Vainas

Ayuda leer datos de webserver con json

Publicado por Vainas (239 intervenciones) el 09/12/2015 19:13:03
Buenas:

Creo que ya esta mas o menos resuelto y sino has llegado a la conclusion queda poco.

Primero para empezar lo mejor para saber json es mirar aqui: http://www.json.org/

Primero que nada json no es ni javascript ni php. Digamos que es una cadena con valores. Vamos a transformar esa cadena al lenguaje que estemos usando actualmente.

La cadena que te dicen que tienes que pasar es esta:

1
2
3
4
5
6
7
8
9
{
"user": "XXXXXXX",
"parameters": [
{
"email": "YYYY@YYYY.com",
"passwd": "ZZZZ"
}
],
}

javascript tendra su forma de crear esa cadena y php tendra otra. De entrada ya has llegado a la conclusion de como lo hace php. Lo que necesitas es algo asi:

1
2
3
4
5
6
7
8
9
10
11
12
$emailpass = array(
			'email' => 'email@mio.com',
			'passwd' => 'lksajfoejld'
		);
 
//No es necesario convertir la primera parte en json		
//$jsonemailpass  = json_encode($emailpass);
 
$entrada = array(
		'user'=> '151543',
		'parameters'=> array($emailpass),  // Se puede tambien hacer asi en versiones superiores de php [$emailpass]
		);

PHP convierte en objetos json los arrays que no tengan un indice numerico y en arrays lo que si lo tienen. Es decir que lo anterior quedaria como lo que te piden cuando le apliques un

1
$jsonentrada = json_encode($entrada);

Hasta aqui tienes el codigo de lo que tienes que enviar en la zona de contenido de un HTTP. Ya has creado tu mismo las opciones del HTTP (lo que van a ser las cabeceras):

1
2
3
4
5
6
7
$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-Type: application/json',
        'content' => $jsonentrada
    )
);

Fijate que le pasamos a content tu cadena ya creada. No tienes que aplicar la function http_build_query por que esta lo que hace es transformar tu json en una cadena con pares de valores que es lo que se suele enviar por defecto por POST en HTTP.

Dicho todo esto solo tienes que enviar:

1
2
$context  = stream_context_create($opts);
$json_file = file_get_contents('http://proveedor.com/actions/servicioWS.php?method=getSessionKey', false, $context);

Decodificar la cadena (string) que te envia el servidor a un objeto PHP:

1
$jfo = json_decode($json_file);

Y acceder a los valores del objeto...

Puedes usar herramientas como "Advanced REST client" o "Postman - REST Client" que son extensiones en chrome para hacer las pruebas, mas que nada por que no deberias en estos casos fiarte lo que devuelve un navegador que puede que intente modificar el formato ya que es de lo que se encarga un navegador de que se vea bien al usuario.

Y esto anterior es la forma PHP de llamar a un servidor por HTTP enviarle unos valores en la zona de contenido y enviar el mensaje con una cabecera de tipo POST.

Ahora puedes hacer lo mismo desde javascript, es decir que la peticion se hara desde el cliente/navegador y no desde tu servidor (puede que por ejemplo el servidor registre la ip desde donde se esta haciendo la peticion....). Son dos formas diferentes esto tiene que quedar claro no tiene nada que ver con lo anterior aun que vas a realizar el paso de valores al servidor de igual forma y a recibir los datos igual que en php pero esta vez en javascript:

Lo primero es utilizar la libreria jquery para hacer mas facil la peticion ajax al servidor. tienes un codigo anterior en donde has hecho la prueba y explico donde esta el problema:

1
2
3
4
5
6
$.ajax({
    data: {"email": "email@mio.com","passwd": "slkjfi93flsld"},
    type: "POST",
    dataType: "json",
    url: "http://proveedor.com/actions/servicioWS.php?method=getSessionKey",
})

empecemos por lo mas facil. dataType le dice a jQuery como vas a recibir tu la respuesta pero no como la vas a enviar, asi que esta bien que definas la respuesta que sera tambien un json pero necesitamos definir el envio.

en data lo que has creado es un objeto javascript no un json. javascript lo interpreta como un objeto que tiene que enviar a el servidor y como pasaba en PHP por defecto lo transforma a pares clave=valor&clave=valor.... asi que tenemos que decirle primero que lo transforme en un string json y luego que lo envie en la zona del http como una cadena o un texto json...

Primero tu objeto data:

var obj_js = { "user": "XXXXXXX", "parameters": [ { "email": "YYYY@YYYY.com", "passwd": "ZZZZ" }]};

luego hay que decirle dentro del ajax que el tipo de contenido es json

contentType: "application/json"

y finalmente al enviar los datos lo transformamos en un string:

data: JSON.stringify(obj_js),

Asi que todo queda algo asi al final:

1
2
3
4
5
6
7
8
9
10
11
var obj_js = { "user": "XXXXXXX", "parameters": [ { "email": "YYYY@YYYY.com", "passwd": "ZZZZ" }]};
$.ajax({
    data: JSON.stringify(obj_js),
    type: "POST",
    dataType: "json",
	contentType: "application/json",
    url: "http://proveedor.com/actions/servicioWS.php?method=getSessionKey",
})..done(function(data){
// el resto de tu codigo...
}
)

jQuery sabe que la respuesta (lo que va a regresar el servidor) es un json por dataType y no solo eso sino que automaticamente transforma ese json en un objeto javascript asi que no tienes que hacer nada en los datos que llegan a ".done(function(data)"

Espero que quede mas claro con esto y que sirva de algo.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 10/12/2015 00:36:41
Hola Vainas

He leido muy atentamente tu post y he intentado ponerlo en practica pero sin resultados, instale el Advanced REST client pero el resultado seguia siendo el mismo

El codigo final en php ha sido
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<?php
 
$emailpass = array(
			'email' => 'email@mio.com',
			'passwd' => 'slksjdflsjd'
		);
 
$entrada = array(
		'user' => '154883',
		'parameters' => [$emailpass]
		);
 
$jsonentrada = json_encode($entrada);
 
$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-Type: application/json',
        'content' => $jsonentrada
    )
);
 
$context = stream_context_create($opts);
 
$json_file = file_get_contents('http://proveedor.com/actions/servicioWS.php', false, $context);
 
$jfo = json_decode($json_file);
 
$session = $jfo->result->session-key;
?>
 
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Ejemplo 4</title>
    <link rel="stylesheet" href="style.css" />
</head>
 
<body>
    <div class="container">
        <h1 class="main_title"><?php echo $session; ?></h1>
        <div class="content">
            <ul class="ul_json clearfix">
			<?php echo "JSONENTRADA : ", $jsonentrada; ?><br/>
			<?php echo "EMAILPASS : ", $emailpass; ?><br/>
			<?php echo "SESION : ", $session; ?><br/>
			<?php echo "DATA : ",$data; ?><br/>
			<?php echo "OPTS : ",$opts; ?><br/>
			<?php echo "CONTEXT : ", $context; ?><br/>
			<?php echo "JSONFILE ", $json_file; ?><br/>
            </ul>
        </div><!-- content -->
    </div><!-- container -->
</body>
</html>

y el resultado final ha sido

1
2
3
4
5
6
7
JSONENTRADA : {"user":"158883","parameters":[{"email":"email@mio.com","passwd":"lsjdfldjsfl"}]}
EMAILPASS : Array
SESION : 0
DATA :
OPTS : Array
CONTEXT : Resource id #2
JSONFILE {"errors":{"code":102,"text":"Method was not included."},"results":""}

Me gusta la forma que va tomando pero sigo sin encontrarle el punto al caldo (estoy viendo top chef)

Gracias x vuestra ayuda, enserio
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
Imágen de perfil de Jordi

Ayuda leer datos de webserver con json

Publicado por Jordi (75 intervenciones) el 10/12/2015 06:12:25
¡Pero si ya lo tienes!

Lo que ha dicho Vainas es cierto, no hacía falta pasar a JSON la primera vez, y había que hacer un JSON stringify, porque ahora sí te crea bien el $jsonentrada. Bien visto.

El error que te da ahora es que no le estás pasando variable method a la URL.

1
$json_file = file_get_contents('http://proveedor.com/actions/servicioWS.php?method=getSessionKey', false, $context);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 10/12/2015 11:18:16
Disculpar, si, al final tanto borrar y modificar me lie un poco y se me olvido el method

Aun así, la respuesta sigue siendo 201
1
2
3
4
5
6
7
JSONENTRADA : {"user":"158883","parameters":[{"email":"email@mio.com","passwd":"lskjaflsjfl"}]}
EMAILPASS : Array
SESION : 0
DATA :
OPTS : Array
CONTEXT : Resource id #2
JSONFILE {"errors":{"code":201,"text":"Invalid JSON: signature field is required."},"results":""}

Me está resultando desesperante y esto es solo para conseguir la keysession con la que luego tengo que acceder a sus datos.
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
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 10/12/2015 12:56:38
Bueno señores, al parecer el problema estaba en el json que nos facilito el proveedor,

resulta que el formato de entrada del json es:

1
2
3
4
5
6
7
8
9
10
11
{
		"user": "XXXXXXX",
		"parameters":
			{
				"email": "YYYY@YYYY.com",
				"passwd": "ZZZZ"
			}
		,
		"session-key" : "",
		"signature": ""
	}

Nada que ver con el anterior

1
2
3
4
5
6
7
8
9
{
"user": "XXXXXXX",
"parameters": [
{
"email": "YYYY@YYYY.com",
"passwd": "ZZZZ"
}
],
}

Voy a intentar solucionarlo con todas las informaciones que me habeis facilitado y si viera algun problema volveria a escribiros, no obstante, cuando lo consiga, os mostrare el codigo final

Gracias a todos, he aprendido muchisimo con vosotros.
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
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 10/12/2015 14:20:52
Bueno, no podia ser tan sencillo, tras modificar el codigo según las nuevas indicaciones del proveedor, ahora me dice que el email o contraseña son incorrectos, pero estan confirmados que está bien y el proveedor me indica que el problema tiene que estar en la llamada
Nuevo codigo a partir del nuevo JSON

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<?php
 
$emailpass = array(
			'email' => 'prueba@proveedor.com',
			'passwd' => '123456'
		);
 
$entrada = array(
		'user' => '111111',
		'parameters' => [$emailpass],
		'session-key' => '',
		'signature' => ''
		);
 
$jsonentrada = json_encode($entrada);
 
$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-Type: application/json',
        'content' => $jsonentrada
    )
);
 
$context = stream_context_create($opts);
 
$json_file = file_get_contents('http://sandbox.proveedor.com/modules/feed/actions/servicioWS.php?method=getSessionKey', false, $context);
 
$jfo = json_decode($json_file);
 
$session = $jfo->result->session-key;
?>
 
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Ejemplo 4</title>
    <link rel="stylesheet" href="style.css" />
</head>
 
<body>
    <div class="container">
        <h1 class="main_title"><?php echo $session; ?></h1>
        <div class="content">
            <ul class="ul_json clearfix">
			<?php echo "JSONENTRADA : ", $jsonentrada; ?><br/>
			<?php echo "EMAILPASS : ", $emailpass; ?><br/>
			<?php echo "SESION : ", $session; ?><br/>
			<?php echo "DATA : ",$data; ?><br/>
			<?php echo "OPTS : ",$opts; ?><br/>
			<?php echo "CONTEXT : ", $context; ?><br/>
			<?php echo "JSONFILE ", $json_file; ?><br/>
            </ul>
        </div><!-- content -->
    </div><!-- container -->
</body>
</html>

Y me responde el webserver

1
2
3
4
5
6
7
JSONENTRADA : {"user":"111111","parameters":[{"email":"prueba@proveedor.com","passwd":"123456"}],"session-key":"","signature":""}
EMAILPASS : Array
SESION : 0
DATA :
OPTS : Array
CONTEXT : Resource id #2
JSONFILE Email or password invalid:

en un ejemplo que me puso el proveedor veo como envía los parametros (por si os ayuda)

1
{%20%22user%22:%20%22111111%22,%20%22parameters%22:%20{%20%22email%22:%20%22prueba@proveedor.com%22,%20%22passwd%22:%20%22123456%22%20},%20%22session-key%22:%20%22%22,%20%22signature%22:%20%22%22%20}

Me va a matar este proveedor
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
Imágen de perfil de Jordi

Ayuda leer datos de webserver con json

Publicado por Jordi (75 intervenciones) el 10/12/2015 16:06:25
Buenas Juanjo,

¿No será que tienes que mandar la contraseña cifrada o algo por el estilo? Porque mandarla en claro es un tanto inseguro por temas de sniffing de tráfico y tal. Tal vez tienes que mandar un hash de la contraseña, que es como suelen estar almacenadas en base de datos.

Lo dudo, pero podría ser una opción...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 10/12/2015 18:24:21
Con esto solo consigo la session-key, una key temporal y única en cada conexión que posteriormente tengo que concatenar con el array de parameters y cifrarla md5 para así obtener los datos que deseo del proveedor, ahí si que lo enviaré cifrado

No, por ahora aun no me piden que sea cifrada.
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
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 10/12/2015 20:39:18
Bueno ya esta solucionado, el problema estaba en la entrada, como bien decían, no me gustaba ver que estaba entre corchetes el email y el password, asi que quite el array y lo deje de la siguiente manera

1
2
3
4
5
6
$entrada = array(
		"user" => "118000",
		"parameters" => $emailpass,     // en lugar de array($emailpass)
		"session-key" => "",
		"signature" => ""
		);

Ahora ya me entrega la session-key correctamente

1
2
3
4
5
6
7
JSONENTRADA : {"user":"111111","parameters":{"email":"prueba@proveedor.com","passwd":"123456"},"session-key":"","signature":""}
EMAILPASS : Array
SESION : 0
DATA :
OPTS : Array
CONTEXT : Resource id #2
JSONFILE {"errors":{"code":0,"text":""},"results":{"session-key":"5cedb6f07fe664aa03add00786d0f390"}}

Ahora a ver como saco la session-key para llevarla al siguiente paso, contando con que la variable $parameters sea $emailpass o $entrada, que eso ya lo veré,

1
2
$json_parameters = json_encode($parameters);
$signature = md5($json_parameters . $session_key);

Ahora tengo que llevar session-key":"5cedb6f07fe664aa03add00786d0f390 a $session_key

Gracias a todos vosotros estoy aprendiendo como nunca.... ¿Seguimos al paso 2?

1
2
3
4
5
6
7
8
$json_file = file_get_contents('http://proveedor.com/modules/actions/servicioWS.php?method=getSessionKey', false, $context);
 
$jfo = json_decode($json_file);
 
$session = $jfo->results->session-key;
 
$json_parameters = json_encode($emailpass);
$signature = md5($json_parameters . $session_key);

Resultado:

1
2
3
4
5
6
7
8
9
JSONENTRADA : {"user":"111111","parameters":{"email":"prueba@proveedor.com","passwd":"123456"},"session-key":"","signature":""}
EMAILPASS : Array
SESION : 0
DATA :
OPTS : Array
CONTEXT : Resource id #2
JSONFILE {"errors":{"code":0,"text":""},"results":{"session-key":"712d508b0c94ca161e311da4d758f9f0"}}
JSONPARAMETERS {"email":"prueba@proveedor.com","passwd":"123456"}
SIGNATURE 895078a934b0da35923a4ba5fb1061d2

Como podeis ver SESION : 0 que es donde tendría que mostrar la session-key, aun esta en blanco
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
Imágen de perfil de Vainas

Ayuda leer datos de webserver con json

Publicado por Vainas (239 intervenciones) el 10/12/2015 21:11:08
Tendras que armar de nuevo el json si quieres volverlo a enviar claro... puedes hacerlo creando un nuevo array o cambiando los valores al que ya tienes:

1
2
3
4
5
6
7
8
$json_file = file_get_contents('http://proveedor.com/modules/actions/servicioWS.php?method=getSessionKey', false, $context);
$jfo = json_decode($json_file);
 
$session = $jfo->results->session-key;
// Simplemente es cambiar el valor
$entrada["session-key"] = $session;
 
$json = json_encode($entrada);

Sobre el signature tendras que preguntar como lo calculan tambien por que puede ser con solo los valores o con el json entero... puede que sea algo asi:

1
$signature = md5('prueba@proveedor.com'.'123456'."712d508b0c94ca161e311da4d758f9f0");

Lo anterior depende de lo que diga el proveedor y se pueden sacar los valores en tiempo real y no como los he puesto yo.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 10/12/2015 21:52:17
Asi tengo que sacarlos, en tiempo real, basandome en las variables obtenidas hasta ahora y luego seguir con mas código


Modificando el codigo tal y como me indicas, solo consigo 0 en echo $session_key

1
2
3
4
5
6
7
8
9
$json_file = file_get_contents('http://sandbox.funizone.com/modules/funizonefeed/actions/servicioWS.php?method=getSessionKey', false, $context);
 
$jfo = json_decode($json_file);
 
$session_key = $jfo->results->session-key;
// Simplemente es cambiar el valor
$entrada["session-key"] = $session_key;
 
echo $session_key;
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
Imágen de perfil de Vainas

Ayuda leer datos de webserver con json

Publicado por Vainas (239 intervenciones) el 10/12/2015 20:44:45
Buenas de nuevo:

No creo que sea la passwd Jordi. Por lo que te muestra el proveedor parece que esta transformando los espacios segun lo que dice el standar sobre el tipo de MIME para los formularios web. Puedes mirar algo aqui: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

De todas formas en un poco raro ya que el standard dice que tiene que transformar los espacios en %20 y las comillas en %22 y hasta alli bien pero los corchetes no son caracteres alfa-numericos... "Non-alphanumeric characters are replaced by `%HH' o eso creo yo, asi que al aplicar algun funcion de php posiblemente te lo transforme tambien.

Segun application/x-www-form-urlencoded los espacios son transformados en el signo mas (+). Pero de todas formas todo lo que te digo es problema de como lo esta haciendo el proveedor...

Te diria que una vez generado el json usases http://php.net/manual/es/function.urlencode.php pero esto puede que transforme tambien los corchetes en un caracter hexadecimal (no lo tengo claro) y sino puedes probrar tambien con http://php.net/manual/es/function.rawurlencode.php

Con la extension Advanced Rest client en chrome prueba con tu url y los datos que te da el cliente si puedes hacer login. A partir de alli podras sacar conclusiones. Pasale la cadena que te dan y envia un post a la url a ver si te regresa algo mas alla de un error.

Suerte.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 10/12/2015 20:52:35
Hola Vainas, por lo visto estabamos escribiendo a la vez y no vistes los avances, (puedes ver el post anterior donde ya consigo la session-key)

El problema es que no solo necesito esa session-key, sino que es el principio de 3 pasos que tengo que hacer para conseguir los datos, por lo que el Advanced Rest client, me serviría para hacer pruebas pero no como solucion definitiva

los 3 pasos que tengo que conseguir son

1.- Obtener la session-key
2.- Transformarla junto a parameters en signature (codificado md5)
3.- con esos dos datos, session-key y signature, entonces comenzar a mandar otros metodos y conseguir los resultados finales (stocks, articulos, etc.)

Por ahora estoy terminando el punto 1 (me falta pasar el resultado obtenido a la variable $session-key) y enlazando ya con el 2
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
Imágen de perfil de Juanjo

Ayuda leer datos de webserver con json

Publicado por Juanjo (27 intervenciones) el 11/12/2015 16:16:05
Bueno muchas gracias a todos, ya he podido sacar la información en pantalla del json del proveedor, la verdad que este proveedor es muy peculiar y daba pocas ayudas e indicaciones, pero entre todos hemos podido conseguir, no solo leer el webserver, sino crear la firma y obtener los resultados

Gracias a todos!

CIERRO EL POST! [RESUELTO]
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