Gebruik maken van de Link Header binnen PHP en CURL_SETOPT

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 19-09 12:45

zeroday

There is no alternative!

Topicstarter
Ik maak gebruik van PHP en Ik haal data van een API op wat JSON terug geeft. In de header wat ik ophaal staat nog vervolg informatie mbt pages die meer resultaten weer geven

code:
1
2
3
4
5
6
7
8
 [server] => openresty/1.9.3.1
    [date] => Sat, 01 Apr 2017 18:00:09 GMT
    [content-type] => application/json;charset=UTF-8
    [content-length] => 17845
    [connection] => keep-alive
    [x-content-type-options] => nosniff
    [link] => <https://domain.nl:443/url>; rel="first", <https://domain.nl:443/url&page=100>; rel="last", <https://domain.nl:443/url&page=2>; rel="next", <https://domain.nl:443/url&page=0>; rel="prev"
    [strict-transport-security] => max-age=31536000; includeSubDomains


De data kan ik wel als een array binnen hengelen zoals ik de header hier toon, maar hoe behandel ik nu de Link header zodat ik hem ook kan gebruiken. Ik snap niet geheel de bedoeling hoe ik mijn resultaten pagina door de verschillende Linken kan sturen want elke link is in principe een nieuwe resultatenpagina waarbij ik de linken ook nog moet voorzien van variabelen

Dus de eerste pagina, daarvan krijg ik de informatie, maar het systeem zegt dat er meer pagina's beschikbaar zijn

Het gaat dan om de Link: functie

Keb al een berg lopen googelen maar geen expliciete info mbt pagination/ HeaderLink en PHP en hoe het aan te vliegen in combinatie met CURL_SETOPT waarmee ik de JSON ophaal ..

btw ik heb totaal 0 programmeer ervaring.
Mijn projectje staat op
https://github.com/aroundmyroom/Schiphol-API-JSON/
en ja, ik heb data en krijg info, maar wil nu net iets verder ;)

There are no secrets, only information you do not yet have

Beste antwoord (via zeroday op 03-04-2017 15:02)


Verwijderd

Dat zou je prima met regular expressions kunnen doen - iets als dit (ongetest, dus vast niet werkend)
Aangenomen dan de link in $link staat.
PHP:
1
preg_match_all('~<(.*)>; rel="(.*)"~Us', $link, $matches, PREG_SET_ORDER);


Je krijgt dan in $matches een array van arrays met gevonden resultaten - even met print_r bekijken en je ziet vanzelf wat je er mee kunt.

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

Verwijderd

Dat zou je prima met regular expressions kunnen doen - iets als dit (ongetest, dus vast niet werkend)
Aangenomen dan de link in $link staat.
PHP:
1
preg_match_all('~<(.*)>; rel="(.*)"~Us', $link, $matches, PREG_SET_ORDER);


Je krijgt dan in $matches een array van arrays met gevonden resultaten - even met print_r bekijken en je ziet vanzelf wat je er mee kunt.

Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 19-09 12:45

zeroday

There is no alternative!

Topicstarter
@zaph .. thanks..

ik krijg een mooie array na wat prutsen

echte url data even omgezet zodat het leesbaar is

code:
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
 (
    [0] => Array
        (
            [0] => <https://domein.nl.nl:443/url>; rel="first"
            [1] => https://domein.nl.nl:443/url
            [2] => first
        )

    [1] => Array
        (
            [0] => <https://domein.nl.nl:443/url&page=100>; rel="last"
            [1] => https://domein.nl.nl:443/url&page=100
            [2] => last
        )

    [2] => Array
        (
            [0] => <https://domein.nl.nl:443/url&page=2>; rel="next"
            [1] => https://domein.nl.nl:443/url&page=2
            [2] => next
        )

    [3] => Array
        (
            [0] => <https://domein.nl.nl:443/url&page=0>; rel="prev"
            [1] => https://domein.nl.nl:443/url&page=0
            [2] => prev
        )


Nu die meuk in een variabele krijgen en kijken hoe ik dat dan weer kan toepassen ;) Want elke request geeft weer een andere header en output.. uhmm wat haal ik me op m'n hals als nono..

There are no secrets, only information you do not yet have


Acties:
  • +1 Henk 'm!

Verwijderd

Je kunt met foreach door $matches heen lopen, en dan afhankelijk van resultaat type [2] de bijbehorende link [1] gebruiken. [0] is altijd de oorspronkelijke string waarin de resultaten voorkwamen.

Ik ga dat loopje niet voorkauwen, want er moet wel wat te leren zijn, immers... ;)

Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 19-09 12:45

zeroday

There is no alternative!

Topicstarter
grin, ja die foreach heb ik al toegepast ergens ;-)
ben al 'trots' op wat er nu uitkomt en wat ik bij elkaar heb kunnen zetten. Het zal vast niet geoptimaliseerd zijn, maar ik krijg data ;-)

There are no secrets, only information you do not yet have


Acties:
  • 0 Henk 'm!

Verwijderd

En daar gaat het om! :)

Acties:
  • 0 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 19-09 12:45

zeroday

There is no alternative!

Topicstarter
zit nu wel vast hoor, de URLS heb ik, maar geen idee hoe ik dat met CURL moet aanvliegen

ik heb al 3 curl statements multi-dubbel erin zitten en geen idee hoe ik dat moet uitbreiden zonder dat
de debug heb ik er nu onderin staan die geeft info weer uit de array

https://github.com/aroundmyroom/Schiphol-API-JSON

maar tsja.. dan hang ik, hoeveel if, then, foreach ik doe ;-)

There are no secrets, only information you do not yet have


Acties:
  • 0 Henk 'm!

Verwijderd

Van die curl-aanroepen zou ik even een functie maken, en die aanroepen - scheelt een stuk code. Zo te zien is dan alleen de URL variabel, dus kun je deze functie aanmaken, en die aanroepen zoals daaronder staat:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function doCurl($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);

// rest curl-code...

    if (substr($result, 0, 3) == "\xEF\xBB\xBF") {
        $result = substr($result, 3);
    }
    return array($result, $header);
}
list($result, $header) = doCurl("$base_url/public-flights/airlines/$airline?app_id=$app_id&app_key=$app_key&page=0");

doCurl geeft een array met 2 waardes terug, en met list() zet je die in 2 variabelen.

Kijk ook even naar je variabelen - je zet strtotime($testdatum0) in $testdatum1, maar je gebruikt $testdatum0 verder nergens zonder strtotime. Noem hem dan $scheduleDate en geef hem de waarde strtotime($flight['scheduleDate']), en vervang $testdatum1 overal door $scheduleDate.

Dat maakt het al een stuk overzichtelijker!

Acties:
  • +1 Henk 'm!

  • zeroday
  • Registratie: Mei 2007
  • Laatst online: 19-09 12:45

zeroday

There is no alternative!

Topicstarter
Zaph,

ik heb inmiddels al je wijzigingen kunnen doorvoeren, heb de CSS nog even laten zitten.

Code is wat overzichtelijker geworden, veel debug notes zijn eruit etc..

ik heb de CURL functie in een aparte function.php gezet zodat dat wat makkelijker is en als ik straks de vertrekken wil implementeren dan hoef ik die functie niet te kopieren in het nieuwe script

De Pagination heb ik met horten en stoten erin gekregen, er bleken wat tikfoutjes aanwezig en wat verkeerde naam variabelen gebruikt te worden .. maar dat zit er nu ook in.

Voor de vluchtnummer wil ik verversen gaan gebruiken en voor de tijden de vorige en volgende pagina
en eventueel de laatste pagina .. die moet ik ergens nog uit de header kunnen toveren . ;_)

Vanavond maar even weer bijwerken op github ;_)

superhulp!

There are no secrets, only information you do not yet have

Pagina: 1