2010-12-31 9 views
7

Consistentemente conseguir un estado de 0 a pesar de que si puedo copiar y pegar la URL enviada en mi navegador, recibo un objeto JSON Derecha¿Hay algún problema con mi código cURL (estado HTTP de 0)?

<?php 


$mainUrl = "https://api.xxxx.com/?"; 
$co = "xxxxx"; 
$pa = "xxxx"; 
$par = "xxxx"; 
$part= "xxxx"; 
$partn = "xxxx"; 
$us= "xxx"; 
$fields_string; 
$fields = array(
      'co'=>urlencode($co), 
      'pa'=>urlencode($pa), 
      'par'=>urlencode($par), 
      'part'=>urlencode($part), 
      'partn'=>urlencode($partn), 
      'us'=>urlencode($us) 
      ); 

foreach($fields as $key=>$value) { $fields_string .= $key . '=' . $value . '&' ;} 

$fields_string = rtrim($fields_string, "&"); 
$fields_string = "?" . $fields_string; 

$url = "https://api.xxxxx.com/" . $fields_string; 

$request = $url; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_TIMEOUT,'3'); 
$content = trim(curl_exec($ch)); 
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

curl_close($ch); 
print $url; 
print $http_status; 
print $content; 



?> 
+0

sólo una nota relacionada: PHP tiene una función muy útil 'http_build_query'. http://php.net/manual/en/function.http-build-query.php – nico

+0

es 'https', ¿se ha devuelto algún error? – ajreal

+0

Sí, acabo de darme cuenta de que comprobar el error sería útil. – Ilya

Respuesta

21

dio cuenta de que yo estaba teniendo problemas de SSL. Simplemente configure CURLOPT_SSL_VERIFYPEER y CURLOPT_SSL_VERIFYHOST en falso. Trabajos.

+7

Si desea usar SSL, puede agregar el indicador CURLOPT_CAINFO y señalar un certificado. Me gusta 'curl_setopt ($ curl, CURLOPT_CAINFO, BASE_DIR.' /certs/cacert.pem ');' – joelcox

+1

@Xoc: +1 de parte mía para señalar que una conexión segura es una opción aquí. –

3

Siempre debe establecer la opción CURLOPT_VERBOSE cuando está depurando curl. Su valor de tiempo de espera parece muy bajo.

17

FYI, también puede obtener un código de estado de 0 si la conexión curl expira antes de que el servidor remoto devuelva datos. En ese caso, debe configurar las opciones de tiempo de curvatura para evitar esa situación. Solo publique esto para cualquier otra persona que tenga problemas de estado 0.

+3

Los detalles sobre cómo configurar el tiempo de curvatura están aquí http://stackoverflow.com/a/11066378/243233 – Jus12

7

que tenían el mismo problema, debe ejecutar el curl_exec ($ ch) comando antes de ejecutar el curl_getinfo ($ ch) comando.

+1

¡Perfecto! ¡Este fue el problema para mí! – Magnus

4

a fin de tratar este obtendrá resultados positivos que he añadido CURLOPT_SSL_VERIFYPEER y opción CURLOPT_SSL_VERIFYHOST en false

<?php 


$mainUrl = "https://api.xxxx.com/?"; 
$co = "xxxxx"; 
$pa = "xxxx"; 
$par = "xxxx"; 
$part= "xxxx"; 
$partn = "xxxx"; 
$us= "xxx"; 
$fields_string; 
$fields = array(
      'co'=>urlencode($co), 
      'pa'=>urlencode($pa), 
      'par'=>urlencode($par), 
      'part'=>urlencode($part), 
      'partn'=>urlencode($partn), 
      'us'=>urlencode($us) 
      ); 

foreach($fields as $key=>$value) { $fields_string .= $key . '=' . $value . '&' ;} 

$fields_string = rtrim($fields_string, "&"); 
$fields_string = "?" . $fields_string; 

$url = "https://api.xxxxx.com/" . $fields_string; 

$request = $url; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_TIMEOUT,'3'); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false); 
$content = trim(curl_exec($ch)); 
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

curl_close($ch); 
print $url; 
print $http_status; 
print $content; 



?> 
+0

perfecto. funcionado bien :) –

Cuestiones relacionadas