2010-09-06 31 views
1

J'ai des problèmes avec le service de connexion MQL freebase. Je fais une demande de poste, puis l'api base libre devrait renvoyer les en-têtes que je vais ensuite analyser et obtenir des informations.cURL et Api de Freebase

Mais la seule tête que je reçois est HTTP/1.0 200 OK

code

class myFreebaseClass { 

.... 

function doLogin() { 

echo $uri = "http://".$this->config['apiSandboxHost'].'/'.$this->config['apiLoginPath'].'username='.$this->config['apiLoginUser'].'&password='.$this->config['apiLoginPass']; 

$ch = curl_init($uri); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$this,'readHeader')); 
$output = curl_exec($ch); 
curl_close($ch); 

} 

function readHeader($ch, $string) 
{ 
    echo "Header: ".$string."<Br />"; 
    if(strpos($string, 'Set-Cookie') !== false) { 
     $this->authCookies[] = str_replace('Set-Cookie: ', '', $string); 
    } 
    return true; 
} 

} 

Sorties

http://sandbox.freebase.com/api/account/login?username=dXXXXX&password=XXXX 
Header: HTTP/1.0 200 OK 

Qu'est-ce que je fais mal? Est-ce que je reçois les en-têtes incorrectement?

Merci d'avance!

+0

En quoi consiste le '$ this'? Êtes-vous à l'intérieur d'un objet? Je ne comprends pas tout à fait ce que vous faites là (mais alors, je n'ai jamais travaillé avec HEADERFUNCTION pour que ce soit moi). Le manuel parle de 'Le nom d'une fonction de rappel où la fonction de rappel prend deux paramètres' donc je ne comprends pas vraiment pourquoi vous spécifiez un tableau? –

+0

Ouais tout le code est dans une classe, la raison du tableau avec $ this est qu'elle appelle readHeader dans cette classe. Sans cela, ce serait une fonction indéfinie. – Lizard

+0

ah, bien sûr. Donc 'readHeader' est vraiment en dehors de la fonction que vous citez ci-dessus? Je suis sûr que c'est le cas, mais d'exclure la possibilité que ce soit un langage/structurelle bizarre plutôt qu'un problème CURL. –

Répondre

2

Il a fini par être un problème avec la fonction readHeader(). Dans mon exemple, je retournais true. Tout a fonctionné quand j'ai renvoyé la longueur de chaque en-tête. par exemple.

function readHeader($ch, $string) 
{ 
    $length = strlen($string); 
    if(strpos($string, 'Set-Cookie') !== false) { 
     $this->authCookies[] = str_replace('Set-Cookie: ', '', $string); 
    } 
    return $length; 
} 

Espérons que cela aide quelqu'un d'autre!

+0

Vous devriez accepter votre réponse –

0

Il semble être un bug avec la boucle de PHP, j'ai pu obtenir le même problème avec les lignes suivantes:

function readHeader($ch, $string) 
{ 
    echo "Header: ".$string."<Br />"; 
} 

echo $uri = 'http://localhost/'; 

$ch = curl_init($uri); 
curl_setopt($ch, CURLOPT_HEADER, 1);//this line can also be omitted 
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'readHeader'); 
$output = curl_exec($ch); 
curl_close($ch); 

Vous devez faire l'extraction des en-têtes de la manière traditionnelle:

class myFreebaseClass { 

.... 

function doLogin() { 

    echo $uri = "http://".$this->config['apiSandboxHost'].'/'.$this->config['apiLoginPath'].'username='.$this->config['apiLoginUser'].'&password='.$this->config['apiLoginPass']; 

    $ch = curl_init($uri); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$this,'readHeader')); 
    $output = curl_exec($ch); 

    //extracting headers: 
    $infos = curl_getinfo($ch); 
    $headers = substr($output, 0, $infos['header_size']); 
    $headers = explode("\n", $headers); 
    //done extracting headers 
    $output = substr($output, $infos['header_size']); 

    foreach($headers as $header) { 
     readHeader($ch, trim($header)); 
    } 
    curl_close($ch); 

    } 

    function readHeader($ch, $string) 
    { 
     echo "Header: ".$string."<Br />"; 
     if(strpos($string, 'Set-Cookie') !== false) { 
      $this->authCookies[] = str_replace('Set-Cookie: ', '', $string); 
     } 
     return true; 
    } 

}