2010-12-31 10 views
7

Konsequent einen Status von 0 bekommen, obwohl, wenn ich die URL kopieren und in meinem Browser geschickt, ich rechts zurückAlles falsch mit meinem cURL-Code (http-Status von 0)?

ein JSON-Objekt erhalten
<?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

nur einen unabhängigen Randnotiz hinzugefügt haben: PHP hat eine sehr praktische 'http_build_query' Funktion. http://php.net/manual/en/function.http-build-query.php – nico

+0

ist 'https', gibt es einen Fehler zurückgegeben? – ajreal

+0

Yup, nur festgestellt, dass die Überprüfung des Fehlers hilfreich wäre. – Ilya

Antwort

21

klar, dass ich SSL Probleme hatte. Setzen Sie CURLOPT_SSL_VERIFYPEER und CURLOPT_SSL_VERIFYHOST einfach auf false. Funktioniert.

+7

Wenn Sie SSL verwenden möchten, können Sie das Flag CURLOPT_CAINFO hinzufügen und auf ein Zertifikat verweisen. Wie 'curl_setopt ($ curl, CURLOPT_CAINFO, BASE_DIR.' /certs/cacert.pem ');' – joelcox

+1

@Xoc: +1 von mir für den Hinweis, dass eine sichere Verbindung hier eine Option ist. –

3

Sie sollten immer die Option CURLOPT_VERBOSE festlegen, wenn Sie für curl debuggen. Ihr Zeitlimitwert ist sehr niedrig.

17

FYI, Sie können auch einen Statuscode von 0 erhalten, wenn die Verbindung unterbrochen wird, bevor der Remote-Server Daten zurückgibt. In diesem Fall müssen Sie die Optionen für die Zeitlupenzeit festlegen, um diese Situation zu vermeiden. Sende es einfach für jeden anderen, der Probleme mit dem Status 0 hat.

+3

Details zur Einstellung der Zeit für die Curl-Einstellung finden Sie hier http://stackoverflow.com/a/11066378/243233 – Jus12

7

Ich hatte das gleiche Problem, müssen Sie den curl_exec ($ ch) Befehl ausführen, bevor Sie den curl_getinfo ($ ch) Befehl ausführen.

+1

Perfekt! Das war das Problem für mich! – Magnus

4

so versuchen, diese werden Sie positive Ergebnisse erzielen i CURLOPT_SSL_VERIFYPEER und CURLOPT_SSL_VERIFYHOST auf 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

perfekt. gut gearbeitet :) –

Verwandte Themen