2011-07-31 4 views
1

J'ai joué avec CURL depuis un jour et je n'arrive pas à comprendre comment analyser les données de retour. Je sais que je pourrais écrire un REGEX pour extraire des données de la réponse, mais il semble qu'il y ait une fonction qui me manque probablement. Voici ce que je voudrais essayer et faire.Analyser les données CURL PHP

Je veux faire POST à ​​un domaine différent et revenir 3 choses 1. les en-têtes de réponse 2. les données de réponse 3. un cookie de session

Est-il possible que je peux obtenir ces 3 choses retour séparément? En ce moment, je viens de récupérer une réponse en texte brut avec l'en-tête de réponse et les données de réponse. Je voudrais être en mesure de faire quelque chose comme

$Response = curl_exec($Curl_Connection); 
$ResponseData = $Response['Data']; 
$ResponseHeader = $Response['Header']; 
ResponseCookie = $Response['Cookie']; 

Est-ce que curl fournit quelque chose comme ça?

Répondre

5

Comme je l'ai répondu:

no post data returned when requesting headers CURLOPT_HEADER. PHP CURL

Ajouter:

curl_setopt($Curl_Connection, CURLOPT_HEADER, TRUE); 

$Response = curl_exec($Curl_Connection); 
$curlHeaderSize=curl_getinfo($ch,CURLINFO_HEADER_SIZE); 

$ResponseData = mb_substr($result, $curlHeaderSize); 
$ResponseHeader = mb_substr($result, 0, $curlHeaderSize); 

preg_match_all('|Set-Cookie: (.*);|U', $ResponseHeader, $content); 
$ResponseCookie = implode(';', $content[1]); 
+0

Oui ce genre de réponses à ma question. Mais d'une certaine manière, ça ne l'est pas. Je ne sais toujours pas comment obtenir juste les en-têtes de réponse tout en ayant toujours le corps retourné. L'autre partie est le cookie est dans l'en-tête de la demande. Comment est-ce que je vois ça? – DvideBy0

+0

Je t'aime et oui je suis un idiot qui n'a jamais utilisé mb_substr :) – DvideBy0

3

Selon les docs papillotes:

/* TRUE to include the header in the output. */ 
curl_setopt($Curl_Connection, CURLOPT_HEADER, TRUE); 

Ainsi, l'en-tête est ajouté à la sortie de la commande curl_exec . J'ai craché cela et je ne vois aucun moyen de récupérer l'en-tête séparément du corps de la réponse. En plus de cela, c'est une grande chaîne, pas un tableau, donc dans le cas où vous voulez l'en-tête dans un format comme par exemple curl_getinfo ramène un tableau.

Le plus simple est de le faire:

$backend_output = curl_exec($ch); 
list($backend_response_headers, $backend_response_body) 
     = explode("\r\n\r\n", $backend_output, 2); 

qui va diviser les deux, mais vous vous retrouvez avec une chaîne pour l'en-tête de réponse, pas un tableau qui serait beaucoup plus utile. Maintenant faire une arraché de cela n'est pas si évident, même avec une regex car on ne peut pas séparer par exemple quelque chose de simple comme/(\ w) \ s: (\ w)/comme ':' peut se produire dans certains champs . Ce serait très cool si curl offrirait les en-têtes séparément mais pour autant que je passe par les docs, il ne semble pas être là. En ce qui concerne vos cookies de session, je crois que vous devez utiliser l'option CURLOPT_COOKIESESSION = true pour cela, mais j'ai moins d'expérience sur les cookies car je n'ai pratiquement jamais besoin de les utiliser. Bonne chance

mise à jour: Les en-têtes que vous pouvez analyser avec http://php.net/manual/en/function.http-parse-headers.php ou une fonction personnalisée de la section des commentaires de l'utilisateur si vous n'avez pas de pecl.