8
votes

Quelque chose de mal avec mon code de courbure (statut HTTP de 0)?

Obtenir systématiquement un statut de 0 Même si je copiez et collez l'URL envoyée dans mon navigateur, je reçois un objet JSON dès le retour

<?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; 



?>


3 commentaires

Juste un côté sans rapport: PHP a une fonction http_build_query très pratique . php.net/manual/fr/funcunk.http-build-query. php


est https , y a-t-il une erreur renvoyée?


Yup, vient de réaliser que la vérification de l'erreur serait utile.


5 Réponses :


24
votes

réalisé que j'avais des problèmes SSL. Simplement définissez curlopt_ssl_verifypeer et curlopt_ssl_verifyHost sur false. Fonctionne.


2 commentaires

Si vous souhaitez utiliser SSL, vous pouvez ajouter le drapeau Curlopt_Cainfo et pointez sur un certificat. Comme 'curl_setopt ($ curl, curlopt_cainfo, base_dir.' /Certs/cacert.pem ');'


@XOC: +1 De moi pour souligner qu'une connexion sécurisée est une option ici.



3
votes

Vous devez toujours définir l'option Curlopt_verbose lorsque vous déboguez pour CURL. Votre valeur de délai d'attente semble très faible.


0 commentaires

17
votes

FYI, vous pouvez également obtenir un code d'état de 0 si la connexion CURL est terminée avant que le serveur distant ne renvoie les données. Dans ce cas, vous devez définir des options de temps de curlette pour éviter cette situation. Il suffit de poster ceci pour quelqu'un d'autre ayant des problèmes de statut 0.


1 commentaires

Détails sur la façon de définir le temps de curl est ici Stackoverflow.com/a/11066378/243233



9
votes

J'ai eu le même problème, vous devez exécuter la commande curl_exec ($ ch) avant d'exécuter la commande curl_getinfo ($ ch) .


1 commentaires

Parfait! C'était le problème pour moi!



4
votes

Essayez-le, vous obtiendrez des résultats positifs que j'ai ajouté Curlopt_ssl_verifypeer et Curlopt_ssl_verifyHost à 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 commentaires