2012-08-28 6 views
1

J'essaye de faire un post de CURL et de courir dans quelques problèmes. Pour l'essentiel, je poste une liste de codes postaux sur une API et, en fonction de ce qui est sélectionné, il peut s'agir d'une très grande liste. Quand je poste seulement quelques codes postaux, cela fonctionne parfaitement. Quand je jette dans une plus grande liste de codes postaux, il échoue avec l'erreur Empty Reply From Server.Erreur de curl: réponse vide du serveur

private function sendApiRequest($action, $request) 
{ 
    // Testing 
    $request['Test'] = $this->apitest; 

    // Build URL 
    $postURL = "{$this->apiurl}?Key={$this->apikey}&API_Action={$action}"; 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $postURL); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($request)); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
    $resp = curl_exec($ch); 

    if(curl_errno($ch)) 
    { 
     var_dump(curl_getinfo($ch)); 
     throw new Exception('Curl Error: ' . curl_error($ch)); 
    } 
    curl_close($ch); 
    return $resp; 
} 

Voici le curl_getinfo() basculantes:

array 
    'url' => string 'https://api.example.com/api.php?Key=xxx&API_Action=insertFilterSet' (length=147) 
    'content_type' => null 
    'http_code' => int 0 
    'header_size' => int 0 
    'request_size' => int 11736 
    'filetime' => int -1 
    'ssl_verify_result' => int 20 
    'redirect_count' => int 0 
    'total_time' => float 0.374 
    'namelookup_time' => float 0 
    'connect_time' => float 0.093 
    'pretransfer_time' => float 0.203 
    'size_upload' => float 11486 
    'size_download' => float 0 
    'speed_download' => float 0 
    'speed_upload' => float 30711 
    'download_content_length' => float -1 
    'upload_content_length' => float 11486 
    'starttransfer_time' => float 0.374 
    'redirect_time' => float 0 
    'certinfo' => 
    array 
     empty 
    'redirect_url' => string '' (length=0) 

Comme je l'ai dit, il fonctionne parfaitement pour les demandes plus petites, mais des erreurs sur de grandes demandes.

+0

Sans savoir ce qu'il y a sur la page, l'appel CURL peut être difficile à dire, mais vous n'accordez que 10 secondes avec curl_setopt ($ ch, CURLOPT_TIMEOUT, 10); Obtenez-vous quelque chose en blanc parce que cela prend trop de temps? Essayez ceci et voyez si cela corrige les choses – DaOgre

+2

Si la seule variable entre les réponses fonctionnantes et inactives est la taille des données que vous envoyez, il y a de fortes chances que ce soit un problème avec le serveur. Cela dit, pourquoi définissez-vous explicitement un en-tête 'Expect: 'vide? Cela n'a aucun sens dans ce contexte et peut être la source du problème. – DaveRandom

+1

@DaveRandom L'en-tête Expect vide est, prétendument, en train de résoudre un autre problème où il retournerait la même réponse, mais avec le code HTTP de 100 au lieu de 0. J'ai googlé cela, et c'était le correctif allégué pour cela. –

Répondre

0

Je suis venu le même problème. Mon Http_code a renvoyé 200 mais ma réponse était vide. Il pourrait y avoir plusieurs raisons à cela, comme je l'ai vécu.

--Le hedaers peut être incorrect

CURLOPT_HTTPHEADER => array('Content-Type:application/json', 'Expect:') 

--Vous pourraient avoir besoin d'envoyer des données comme les champs de poste dans CULR et non liés à l'URl comme url? P1 = a1 & p2 = a2

$data = array (p1=>a1, p2=>a2) 
CURLOPT_POSTFIELDS => $data 

donc votre tableau d'options serait similaire au-dessous

array(
    CURLOPT_URL => $url, 
    CURLOPT_FAILONERROR => TRUE, // FALSE if in debug mode 
    CURLOPT_RETURNTRANSFER => TRUE, 
    CURLOPT_TIMEOUT => 4, 
    CURLOPT_HTTPHEADER => array('Content-Type:application/json', 'Expect:'), 
    CURLOPT_POST => TRUE, 
    CURLOPT_POSTFIELDS => $data, 
);