Archief - Gegevens uit API halen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

CrushTheButton

Legacy Member
Ik zou graag eens leren hoe je data uit een API kan halen. Elke API is wel wat anders, dat weet ik ook. Ik heb al wat zitten zoeken, maar ik snap nog steeds niet hoe je precies gegevens uit een API haalt.

Neem nu dit voorbeeld:
Code:
var pd={ pc: { label: 'PC', count: 68827 },
  ps3: { label: 'PS3', count: 57947 },
  xbox: { label: 'XBOX360', count: 24770 },
  xone: { label: 'XBOXONE', count: 13358 },
  ps4: { label: 'PS4', count: 3695 } };

API link: http://api.bf4stats.com/api/onlinePlayers?output=js

Hoe kan je hier nu gegevens uithalen? De documentatie van de API maakt me niet veel wijzer op hoe ik dit nu kan weergeven.

Weten jullie artikels die dit soort toestanden behandelen, of kan je het zelf uitleggen? Ik hoor het graag.

Alvast bedankt!

profound

Legacy Member
Das een json object, in principe dus gewoon een js object, dus;
var pcCount = pd[pc]['count'];

Ge kunt da ook in ne 'advanced for loop' (foreach dus) steke bijvoorbeeld.

Scissor

Legacy Member
Code:
var pd

$.each(pd, function(i, item) {
    alert(pd[i].label);
});​

Met dit loopje alert je (via jQuery) elk label uit de array. Hoe je communiceert met een api is via een $.getJSON of $.ajax (getJSON is shorthand-code die eigelijk gelijk is aan een ajax request met Json type).

CrushTheButton

Legacy Member
Is er ook een mogelijkheid om dit dan via PHP te doen? En hoe kan ik dan uit die link de data ophalen?
Alvast bedankt voor de antwoorden!

De Wouter

Legacy Member
CrushTheButton zei:
Is er ook een mogelijkheid om dit dan via PHP te doen? En hoe kan ik dan uit die link de data ophalen?
Alvast bedankt voor de antwoorden!

$object = json_decode($json);

$json = json_encode($object);

($json is een string)

CrushTheButton

Legacy Member
Ik heb gekeken hoe json_decode ongeveer werkt, maar ik snap al niet goed hoe ik de data in mijn php bestand krijg. Ik las wat over curl. En wanneer ik da data dan in het bestand krijg dan zit ik nog met de var pd die ik weg moet krijgen toch? Of ben ik verkeerd aan het denken?

bealzebub

Legacy Member
Idd, je moet via PHP een curl get doen en die dan decoden, iets zoals dit

Code:
               $url = "http://url.hier.be/";
		
		$ch = curl_init();
		
		curl_setopt($ch,CURLOPT_URL,$url);
		curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
		curl_setopt($ch, CURLOPT_HTTPHEADER, array(
				'Content-Type: application/json',
				'Accept: application/json'));
				
		$response = curl_exec($ch);
		$error = curl_error($ch);
		
		$result = array();
		$result['success'] = 1;
		$result['count'] = 0;
		if ( $error != "" ) {
			$result['success'] = 0;
			$result['error'] = $error;
			return $result;
		}
		$result['data'] = json_decode($response);
		$result['http_code'] = curl_getinfo($ch,CURLINFO_HTTP_CODE);
		if ($result['http_code'] >= 400) $result['success'] = 0;
		return $result;

Keep in mind da k geen PHP developer ben, t is maar iets da k snel bijeengeraapt heb door wat opzoekwerk.

Nog een extra weetje: PHP (of Ruby, Python, …) zet een global lock op het process terwijl je die GET doet, dus zolang er geen antwoord komt kan de code niet verder en is je PHP instance volledig geblokkeerd. Zelfs met een timeout van bv 5 seconden is dat verre van ideaal bij een site zelfs bij lage bezoekersaantallen. Er zullen wel oplossingen zijn om dat in een worker af te splitsen, maar de uitleg daarover laat ik over aan mensen die meer met PHP vertrouwd zijn.

profound

Legacy Member
Als dat echt een probleem zou zijn kan je nog altijd asynchroon je data gaan ophalen via ajax.
Als je trouwens de mogelijkheid hebt om dit met js te doen, zie ik niet in waarom je php zou gebruiken. Ik ben wel biased omdat ik js veel leuker vind dan php :p

bealzebub

Legacy Member
profound zei:
Als dat echt een probleem zou zijn kan je nog altijd asynchroon je data gaan ophalen via ajax.
Als je trouwens de mogelijkheid hebt om dit met js te doen, zie ik niet in waarom je php zou gebruiken. Ik ben wel biased omdat ik js veel leuker vind dan php :p

Soms wil je webservices op de server consumen en niet op de client, en dat is wat de TS wil doen volgens mij.

Bovendien zit je met cross site request limitaties. Stel dat je het nog op de client zou kunnen doen, dan zijn er drie mogelijkheden:
  • De externe webservice ondersteunt CORS: in dit geval kan je idd asynchroon gaan werken en zal je AJAX request non-blocking zijn. De realiteit is dat heel weinig webservices CORS ondersteunen, want het brengt een pak security gotchas met zich mee.
  • De externe webservice ondersteunt JSONP: in dit geval is je AJAX request niet puur asynchroon, tenminste als je dat bij het inladen van de pagina aanroept. Waarom? JSONP gaat een script tag injecteren in je pagina en scripts zijn blocking. Heel simpel om te bewijzen: roep een JSONP request aan in je document load event die een beetje traag is (of roep een service aan die niet bestaat), zet dan wat JS code in je window load event (wat heel veel interface JS gebruikt) en je zal zien dat die window load niet triggert tot vijf seconden later (of whatever timeout er gezet is).
  • De externe webservice ondersteunt geen van beiden: vergeet clientside, enkel via serverside fetching op te halen

In dit geval heeft de TS geluk, de API ondersteunt CORS requests, dus in dit geval zou je idd beter clientside werken, tenzij je effectief serverside iets met die gegevens wil doen.

Nog een opmerking voor de TS, je URL die je moet aanroepen is zonder die "?output=js" vanachter, dan krijg je de JSON versie terug. Met die "?output=js" erachter krijg je een Javascript object terug. Je zou dat nooit willen gebruiken trouwens, staat in de documentatie overigens duidelijk vermeld dat het enkel voor debugging is.

CrushTheButton

Legacy Member
bealzebub, bedankt voor je hulp. Ik begin het nu al beter te begrijpen. Hoe krijg ik nu die gegevens dan in een array? Ik zie de array van $result staan, maar ik snap niet goed hoe wat die doet.

Kan ik daar dan een array zoals deze van maken:

PHP:
$data = array(
   'platform' => 'pc',
   'players' => 'count'
)

CrushTheButton

Legacy Member
Ik heb het denk ik gevonden. Om het nummer van de pc te halen doe ik dit.

Code:
print_r($result['data']->pc->count);
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan