[Php-avanzado] consulta cURL
Leonardo Tadei - Pegasus Tech Supply
leonardot en pegasusnet.com.ar
Mie Jun 5 14:16:42 ART 2013
Hola Cesar,
Para probar, puse en un string la respuesta del servidor cuando llama a
la API:
<?php
$json =
'{"meta":{"code":200,"errorType":"deprecated","errorDetail":"Please
provide an API version to avoid future errors.See http:\/\/bit.ly
\/vywCav"},"response":{"tips":{"count":10,"items":[{"id":"514e78f4e4b025094e579032","createdAt":1364097268,"text":"Buenos precios y tienen Grog XD","canonicalUrl":"https:\/\/foursquare.com\/item\/514e78f4e4b025094e579032","likes":{"count":1,"groups":[{"type":"others","count":1,"items":[{"id":"531471","firstName":"Pol","lastName":"N.","gender":"male","photo":"https:\/\/is1.4sqi.net\/userpix_thumbs\/LTCBI4MF0TEICJSF.jpg","tips":{"count":7},"homeCity":"Buenos Aires, Argentina","bio":"Para papá banana a las brasas.","contact":{}}]}],"summary":"1 me gusta"},"todo":{"count":0},"done":{"count":1},"user":{"id":"11719940","firstName":"Varda","lastName":"E.","gender":"female","photo":"https:\/\/is0.4sqi.net\/userpix_thumbs\/KW0IIDQCRNDHDEUF.jpg","tips":{"count":27},"lists":{"groups":[{"type":"created","count":1,"items":[]}]},"homeCity":"Mar del Plata, Argentina","bio":"Geek, gamer, Blogger, Time Lady, Dark Lady of the Sith, Reina de las Estrellas, fan de Tolkien y de los juegos de rol!","contact":{}}},{"id":"510f4cbde4b07546a703c086","createdAt":1359957181,"text":"Muy recomendable buen ambiente, la onda del lugar tipo hawaiano como sirven los tragos y los precios normales","canonicalUrl":"https:\/\/foursquare.com\/item\/510f4cbde4b07546a703c086","likes":{"count":0,"groups":[]},"todo":{"count":0},"done":{"count":1},"user":{"id":"38697783","firstName":"Lucas","lastName":"M.","gender":"male","photo":"https:\/\/is1.4sqi.net\/userpix_thumbs\/K4OBOQYCUXY0A1OB.jpg","tips":{"count":11},"homeCity":"Ciudad de Buenos Aires","bio":"","contact":{}}}]}}}';
$v = json_decode($json,true);
print("<pre>");
print_r($v);
print("</pre>");
?>
y el resultado es lo que se espera:
Array
(
[meta] => Array
(
[code] => 200
[errorType] => deprecated
[errorDetail] => Please provide an API version to avoid
future errors.See http://bit.ly/vywCav
)
[response] => Array
(
[tips] => Array
(
[count] => 10
[items] => Array
(
[0] => Array
(
[id] => 514e78f4e4b025094e579032
[createdAt] => 1364097268
[text] => Buenos precios y tienen
Grog XD
[canonicalUrl] =>
https://foursquare.com/item/514e78f4e4b025094e579032
[likes] => Array
(
[count] => 1
[groups] => Array
(
[0] => Array
(
[type] =>
others
[count] => 1
[items] =>
Array
(
[0]
=> Array
(
[id] => 531471
[firstName] => Pol
[lastName] => N.
[gender] => male
[photo] => https://is1.4sqi.net/userpix_thumbs/LTCBI4MF0TEICJSF.jpg
[tips] => Array
(
[count] => 7
)
[homeCity] => Buenos Aires, Argentina
[bio] => Para papá banana a las brasas.
[contact] => Array
(
)
)
)
)
)
[summary] => 1 me gusta
)
[todo] => Array
(
[count] => 0
)
[done] => Array
(
[count] => 1
)
[user] => Array
(
[id] => 11719940
[firstName] => Varda
[lastName] => E.
[gender] => female
[photo] =>
https://is0.4sqi.net/userpix_thumbs/KW0IIDQCRNDHDEUF.jpg
[tips] => Array
(
[count] => 27
)
[lists] => Array
(
[groups] => Array
(
[0] => Array
(
[type] => created
[count] => 1
[items] => Array
(
)
)
)
)
[homeCity] => Mar del Plata,
Argentina
[bio] => Geek, gamer,
Blogger, Time Lady, Dark Lady of the Sith, Reina de las Estrellas, fan
de Tolkien y de los juegos de rol!
[contact] => Array
(
)
)
)
[1] => Array
(
[id] => 510f4cbde4b07546a703c086
[createdAt] => 1359957181
[text] => Muy recomendable buen
ambiente, la onda del lugar tipo hawaiano como sirven los tragos y los
precios normales
[canonicalUrl] =>
https://foursquare.com/item/510f4cbde4b07546a703c086
[likes] => Array
(
[count] => 0
[groups] => Array
(
)
)
[todo] => Array
(
[count] => 0
)
[done] => Array
(
[count] => 1
)
[user] => Array
(
[id] => 38697783
[firstName] => Lucas
[lastName] => M.
[gender] => male
[photo] =>
https://is1.4sqi.net/userpix_thumbs/K4OBOQYCUXY0A1OB.jpg
[tips] => Array
(
[count] => 11
)
[homeCity] => Ciudad de
Buenos Aires
[bio] =>
[contact] => Array
(
)
)
)
)
)
)
)
El mié, 05-06-2013 a las 13:33 -0300, Cesar Gimenez Lascano escribió:
> Esta es la URL con la que me estoy comunicando con la api por si
> quieren hacer algun test (incluye mis api keys), si la pongo en el
> navegador se imprimen los datos recibidos en json. Gracias!
>
>
> https://api.foursquare.com/v2/venues/4ee6d4ed775ba356e007bb76/tips?sort=recent&limit=2&client_id=315YX0EUHY5VW5SFVCPIBMMVYTSNCXNML20AHEEDL1Q2TMEE&client_secret=HOJHGWETZPZYXLS2NYSPMUO0A4WO2UQCUHVWEAXQWAOWROZ2
>
>
>
> El 5 de junio de 2013 10:05, Cesar Gimenez Lascano
> <cesargimenezlascano en gmail.com> escribió:
> Gracias. me sigue imprimiendo NULL, me estará faltando algo
> mas?
>
>
> El 4 de junio de 2013 20:18, Matias Gea <matigea en gmail.com>
> escribió:
>
> Te falta un parámetro de json decode:
>
>
> json_decode($contents, true);
>
>
> Sino te devuelve un objeto, en vez de un array.
>
>
> Saludos!
>
>
>
>
> El 4 de junio de 2013 20:08, Cesar Gimenez Lascano
> <cesargimenezlascano en gmail.com> escribió:
>
> Lo estoy probando pero me devuelve NULL, el
> código:
>
>
> <?php
> $ch = curl_init();
> curl_setopt($ch, CURLOPT_URL,
> 'https://api.foursquare.com/v2/venues/VENUE_ID/tips');
> curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
> $contents = curl_exec ($ch);
> $result = json_decode($contents);
> print($result['response']['tips']['text']);
> var_dump($result);
> curl_close ($ch);
> ?>
>
>
> El 4 de junio de 2013 19:20, Matias Gea
> <matigea en gmail.com> escribió:
>
> La respuesta parece json standard.
> Hacé algo así:
>
>
> $arr = json_decode($respuesta,true);
>
>
> te va a devolver un array asociativo
> en $arr, después, para ver el valor
> hacés $arr['response']['tips']['text']
>
>
> Avisanos como fue.
>
>
> Saludos!
>
>
> El 4 de junio de 2013 19:02, Cesar
> Gimenez Lascano
> <cesargimenezlascano en gmail.com>
> escribió:
>
> me puse a probar con curl, en
> el curso habíamos visto que es
> un programa externo, pero
> existe una biblioteca php tmb
> no? me podrían dar una mano
> para recuperar los datos de la
> api con curl y lo que mas se
> me complico, guardar el dato
> "text" de la respuesta que es
> una matriz. Gracias!!
>
>
> URL:
> https://api.foursquare.com/v2/venues/VENUE_ID/tips
>
>
>
> formato de la respuesta:
>
>
> {
>
> response: {
> * tips: {
> * count: 305
> * items: [
> * {
> * id: "51a762a4498e136ef3a77f2b"
> * createdAt: 1369924260
> * text: "I don't care if you get the beloved blueberry pancakes or not, but the must have here is the SUGAR-CURED BACON!"
> * canonicalUrl: "https://foursquare.com/item/51a762a4498e136ef3a77f2b"
> * likes: {
> * count: 0
> * groups: [ ]
> }
> * like: false
> * todo: {
> * count: 0
> }
> * user: {
> * id: "13722555"
> * firstName: "Mehmetali"
> * lastName: "Y."
> * gender: "male"
> * photo: {
> * prefix: "https://irs3.4sqi.net/img/user/"
> * suffix: "/DJUPSJ43K1EJ4ZHF.jpg"
> }
> }
> }
>
>
> El 4 de junio de 2013 16:12,
> Cesar Gimenez Lascano
> <cesargimenezlascano en gmail.com> escribió:
> Gracias Matias x toda
> la info!! creo lo
> mejor sera llamar a
> las apis con CURL
> desde el lado del
> servidor. Es
> importante lo que
> decís que hay que
> tratar de no depender
> de servicios externos
> y no es un buen uso de
> AJAX el que estaba
> haciendo como dijo
> Leo. Veremos como sale
> todo el sábado, dps te
> comento, saludo grande
> y gracias x la ayuda y
> el tiempo!!!
>
>
> El 4 de junio de 2013
> 08:55, Matias Gea
> <matigea en gmail.com>
> escribió:
>
> Buenas!
>
>
> Exactamente a
> eso me
> refería. A
> pasar al
> server parte
> del proceso
> que ahora hace
> el cliente
> (algunas de
> las
> peticiones).
> Se puede
> llamar a las
> api fácilmente
> con curl o
> directamente
> file_get_contents o fopen.
>
>
> Igualmente
> conozco el
> paño y sé que
> algunas de las
> apis son
> bastante
> limitadas.
>
>
> Si hacés las
> peticiones
> desde el
> server, es
> necesario
> hacer caché.
> Uno de los
> parámetros que
> utilizan las
> apis para
> identificar el
> cliente es la
> ip (en
> especial las
> api que no
> requieren api
> key). Si hacés
> muchas
> peticiones
> desde la misma
> ip en un
> período corto
> de tiempo, te
> banean. Por
> ejemplo, si
> una api tiene
> un máximo de
> 100 peticiones
> por hora por
> ip, si no
> cacheas y te
> entran 110
> clientes al
> sitio, te
> bloquean la
> api.
>
>
> Por esto
> también a
> veces es una
> buena opción
> que el haga la
> petición sea
> el cliente, te
> evitás los
> límites de
> algunas api,
> pero a costa
> de hacer
> muchas más
> peticiones y
> depender de la
> estabilidad de
> servicios
> externos
> (algunas apis,
> como la de
> facebook o
> twitter,
> pueden hacer
> que tu página
> cargue hasta
> 10 segundos
> más tarde, lo
> que rompe
> estadísticas,
> experiencia de
> usuario,
> etc.).
>
>
> Por eso es un
> caso a
> analizar, para
> no perder
> funcionalidad,
> pero maximizar
> la experiencia
> de usuario y
> recursos.
>
>
> Saludos!
>
>
> PD: Quiero
> saber que
> resuelven el
> sábado!
>
>
>
>
>
>
> El 3 de junio
> de 2013 16:04,
> Cesar Gimenez
> Lascano
> <cesargimenezlascano en gmail.com> escribió:
>
> Gracias Leo! voy a repensar algunas cosas y seguimos dialogando el sábado. Gracias x el tiempo, nos vemos!!
>
>
> El 3
> de
> junio
> de
> 2013
> 15:49,
> Leonardo Tadei - Pegasus Tech Supply <leonardot en pegasusnet.com.ar> escribió:
>
> Hola Cesar,
>
>
> si los datos se actualizan frecuentemente, no veo en tu código cómo se
> cargan más de una vez luego de cargada la página.
>
> La llamada AJAX tiene sentido para recargar una parte de la página,
> pero acá no hay un timer ni nada (o no lo veo) que haga que se recarguen
> las cosas.
>
> No conozco la interfaz, pero por el código parece que hay botones con
> cada categoría (alojamientos, bares, restaurantes, comercios y puntos de
> interés) y que al clickear cada botón, mostrar esa categoría y dejás de
> mostrar las otras.
>
> Al no recargarse automáticamente y al no mostrarse más de una capa a la
> vez, la aproximación KISS sería tener una página para cada cosa y que
> directamente se cargue la que corresponde.
>
> Luego en cada página ejecutás en PHP lo que sea que haga
> json/cargarAloj.php
> json/cargarBares.php
> etc
>
> y generás por ejemplo un vector JS con los datos; en el cliente solo te
> encargás de mostrar esos puntos.
>
>
> Esto es a lo que apuntaba Matías: podrías hacer lo mismo sin usar par
> nada AJAX y no pelearte con la race-condition que se te está generado.
>
>
> Por otra parte, posiblemente debas hacer que los:
> json/cargarAloj.php
> json/cargarBares.php
> etc
>
> guarden la respuesta y vayan a buscar cosas nuevas solo cada X minutos,
> para no saturar la API con peticiones (y que te echen a patadas)
>
>
> Supongo que como la cosa pasó de sintaxis a cuestiones del planteo del
> algoritmo, las veremos el sábado que viene cuando te des una vuela por
> el curso.
>
>
> Saludos cordiales!
>
>
>
> El lun, 03-06-2013 a las 13:47 -0300, Cesar Gimenez Lascano escribió:
> > Volviendo al código, si sugerís que caRgue los datos de las dos
> > llamadas remotas (foursquare, twitter) a la BD, estos datos se
> > actualizan frecuentemente, tmb para obtenerlos utilizo las ids
> > guardadas en mi BD, no veo como podría hacerlo de esa forma....
> > saludos y gracias!!!
> >
> >
> > El 3 de junio de 2013 13:40, Cesar Gimenez Lascano
> > <cesargimenezlascano en gmail.com> escribió:
> > Uh! perdón a mi por el error de tipeo!! creo que me traiciono
> > el subconciente porque esta implementacion se me complico
> > bastante....disculpas...
> >
> >
> > El 3 de junio de 2013 12:37, Leonardo Tadei - Pegasus Tech
> > Supply <leonardot en pegasusnet.com.ar> escribió:
> >
> > Hola Cesar,
> >
> > perdón por el error de tipeo.
> > Debería decir "devolverlo ya caRgado desde el
> > servidor"
> >
> > Salu2
> >
> >
> > El dom, 02-06-2013 a las 11:28 -0300, Cesar Gimenez
> > Lascano escribió:
> > > Gracias Leo! disculpame, a que te referís con
> > "devolverlo ya cagado
> > > desde el servidor"? a guardar los datos recibidos de
> > las llamadas a
> > > las apis en la base de datos? gracias x la ayuda.
> > saludos!!
> > >
> > >
> > > El 1 de junio de 2013 19:15, Leonardo Tadei -
> > Pegasus Tech Supply
> > > <leonardot en pegasusnet.com.ar> escribió:
> > > Cesar:
> > >
> > > Quiero volver a una cuestión que
> > Matías platea muy
> > > correctamente: no
> > > tiene sentido hacer varias llamadas AJAX en
> > un bucle, porque
> > > si te hace
> > > falta todo esto, devolvelo ya cargado desde
> > el servidor y
> > > listo!
> > > Más allá del problema de sintaxis
> > que haya, no es un
> > > uso razonable de
> > > AJAX, ya que es más lento todo esto que
> > cargar los valores
> > > desde el
> > > principio.
> > >
> > > Acordate del "principio de
> > programación KISS" !!!
> > >
>
>
>
>
> --
> Leonardo Tadei
> leonardot en pegasusnet.com.ar
> Web: http://leonardo.tadei.com.ar
> Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key
>
> _______________________________________________
> Php-avanzado mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>
>
>
>
> _______________________________________________
> Php-avanzado mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>
>
>
>
> --
> Matias
> Fernando Gea
> matigea en gmail.com
> http://www.mfgea.com.ar
>
> _______________________________________________
> Php-avanzado
> mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>
>
>
>
>
> _______________________________________________
> Php-avanzado mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>
>
>
>
> --
> Matias Fernando Gea
> matigea en gmail.com
> http://www.mfgea.com.ar
>
> _______________________________________________
> Php-avanzado mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>
>
>
> _______________________________________________
> Php-avanzado mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>
>
>
>
> --
> Matias Fernando Gea
> matigea en gmail.com
> http://www.mfgea.com.ar
>
> _______________________________________________
> Php-avanzado mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>
>
>
>
> _______________________________________________
> Php-avanzado mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
--
Leonardo Tadei
leonardot en pegasusnet.com.ar
Web: http://leonardo.tadei.com.ar
Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key
Más información sobre la lista de distribución Php-avanzado