2016-08-04 12 views
1

Zusammenfassung: Ich benutze PHP/CURL, um einige JSON-Daten von Vimeo zu bekommen.PHP + cURL, Parsing Header-Daten

Dies wurde gut funktioniert, (wenn auch ihre ungerade "Ratenbegrenzung Anforderungen), auf folgende Arten:

$curl = curl_init(); 
curl_setopt_array($curl, array(
    CURLOPT_URL => $json_url, 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_ENCODING => "", 
    CURLOPT_MAXREDIRS => 10, 
    CURLOPT_TIMEOUT => 30, 
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
    CURLOPT_CUSTOMREQUEST => "GET", 
    CURLOPT_HTTPHEADER => array("authorization: Bearer ".$access_token) 
)); 
$response = curl_exec($curl); 
$response_info = curl_getinfo($curl); 
$err = curl_error($curl); 
curl_close($curl); 

die gut arbeitet, wenn ich zu JSON verdeckte und die Datenausgabe wie so verwenden:

$vimeoJSON = json_decode($response, true); 

echo '<h2 class="title">'.$vimeoJSON['name'] . '</h2>'; 

sendet jedoch Vimeo einige benötigten Daten (aktuelles Rate-Limit und die verbleibenden limit..etc) in der Kopfzeile RESPONSE zurück ...

Also suchte ich mich um und las, dass Sie hinzufügen müssen dies den cURL Optionen/params:

CURLOPT_HEADER => true, 

Also tat ich, dass:

$curl = curl_init(); 
curl_setopt_array($curl, array(
    CURLOPT_URL => $json_url, 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_ENCODING => "", 
    CURLOPT_MAXREDIRS => 10, 
    CURLOPT_TIMEOUT => 30, 
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
    CURLOPT_CUSTOMREQUEST => "GET", 
    CURLOPT_HEADER => true, 
    CURLOPT_HTTPHEADER => array("authorization: Bearer ".$access_token) 
)); 
$response = curl_exec($curl); 
$response_info = curl_getinfo($curl); 
$err = curl_error($curl); 
curl_close($curl); 

und verwendet diese Informationen, zu brechen:

//get response header details 
list($headers, $body) = explode("\n\n", $response, 2); 
$headers = explode("\n", $headers); 
foreach ($headers as $header) { 
    list($key, $value) = explode(':', $header, 2); 
    $headers[trim($key)] = trim($value); 
} 

Und zeigte es etwa so:

echo '<p>'; 
echo "Rate Limit: " . $headers['X-RateLimit-Limit']; 
echo "/Remaining Limit: " . $headers['X-RateLimit-Remaining'] . '<br>'; 
echo "Reset Time: " . $headers['X-RateLimit-Reset'] . '<br>'; 
echo '</p>'; 

An diesem Punkt war ich - Erhalten meiner benötigten Header-Antwortdaten von Vimeo ..

aber der Rest der JSON-Daten ist jetzt weg/nicht mehr angezeigt.

dh:

echo '<h2 class="title">'.$vimeoJSON['name'] . '</h2>'; 

mehr nicht angezeigt.

Wenn ich diese Zeile aus kommentieren: CURLOPT_HEADER => true,

Diese Arbeit wieder .. (aber bekomme ich meine Header-Antwort nicht mehr Daten von Vimeo

Frage ist:.

  • Wie kann ich meinen Code aktualisieren für beide ?? die Header-Antwortdaten von Vimeo .. und noch in der Lage zu ermöglichen, die $ vimeoJSON [ ‚xxxx‘] Daten zu verwenden, die ich während meiner App durchlöchert haben?

@Taylor

Wenn Ihr Code Probe mit (ich weiß, auf dem Netz an anderer Stelle gefunden)

//temp 
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 
$header = substr($response, 0, $header_size); 
$body = substr($response, $header_size); 

echo "HEADER SIZE: " . $header_size . "<br><br>"; 
echo "HEADER: " . $header . "<br><br>"; 
echo "BODY: <pre>" . $body . "</pre><br><br>"; 

spielt keine Rolle, wenn ich die ausführliche oder Header auf true gesetzt ..

der zurück einbetten Code ist kaputt?

scheint mit doppelten Anführungszeichen entkommen oder etwas zu kommen:

^iframe src=\"https://player.vimeo.com/video/171002772?badge=0&autopause=0&player_id=0\" width=\"900\" height=\"450\" frameborder=\"0\" title=\"How to Save A Dying LVAD - Zachary M. Shinar, MD\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe^ 

vs

^iframe src="https://player.vimeo.com/video/171002772?badge=0&autopause=0&player_id=0" width="900" height="450" frameborder="0" title="How to Save A Dying LVAD - Zachary M. Shinar, MD" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe^ 

Antwort

1

CURLOPT_HEADER bewirkt, dass die HTTP-Header Teil werden der Ausgabe von curl_exec, was bedeutet, dass Sie nicht empfangen werden g nur JSON, Sie erhalten Header + JSON, z.B.

$response vor:

{"foo":"bar"} 

$response nach:

Header1: value1 
header2: value2 

{"foo":"bar"} 

Wenn Sie passieren, dass after Wert direkt an json_decode(), es werde kotzen, weil es mehr NICHT gültig json ist. Sie müssen die gesamte Header-Komponente von dieser Zeichenfolge abzie- hen. Es handelt sich also nur um die einfache JSON-Zeichenfolge.

+0

Danke .. Das macht Sinn .. aber wie kann ich sie trennen? Gibt es eine gebaute Methode? – whispers

+0

per Definition sind HTTP-Header durch eine Leerzeile vom Hauptteil getrennt. so ... gespalten auf die leere Zeile, und alles danach sollte nur der Körper sein. –

+0

ahh .. also einfach manuell parsen/trennen (duh!) Entschuldigung für die dichte da! Ich (aus welchem ​​Grund auch immer) dachte, dass es einen eingebauten CURL/OPT-Ansatz zum Trennen gab. Ich versuche es mal. (Antwort angenommen) Vielleicht setzen Sie das in Ihre volle Antwort für andere (die vielleicht auch ein Gehirn furzen), um es zu sehen! – whispers

0

CURLOPT_VERBOSE praktisch ist:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_VERBOSE, 1); 
curl_setopt($ch, CURLOPT_HEADER, 1); 

$response = curl_exec($ch); 

$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 
$header = substr($response, 0, $header_size); 
$body = substr($response, $header_size); 
+0

können Sie das ausarbeiten? ist praktisch ... wie? (Ich bin nicht klar über seine Verwendung .. noch, wie es in Ihrem Beispiel verwendet wird, um mein Problem zu lösen?) – whispers

+0

* update: wenn ich das obige Beispiel, insbesondere die $ body var .. wenn ich die Daten in gehalten $ body .. der iframe/embed Code funktioniert nicht? Nicht sicher, welche Wirkung das auf die von Vimeo zurückgegebenen Daten hat? Aber der iFrame-Code lädt den Video/Player nicht mehr. Ich habe den aktualisierten Code im ursprünglichen Post veröffentlicht. – whispers