Communiquez avec api en utilisant cURL de php

Par Ouedraogo Mahomed, il y a 8 ans


Bonjour,
Je suis actuelement sur un projet basé sur SWITCHVOX !!!
pour ma part de developpeur je dois creer une interface web pour interagir avec l'apps switchvox notament:

<?php
function do_post_request($lien, $header, $postDataJson){
$curl = curl_init();

    $opts = [
        CURLOPT_URL => $lien,
        CURLOPT_HTTPHEADER =>$header,
        CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
        //login/mot de pass de connection a l'api
        CURLOPT_USERPWD => "admin:admin",
        CURLOPT_CONNECTTIMEOUT => 2,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => TRUE,
        CURLOPT_MAXREDIRS => 2,
        CURLOPT_COOKIESESSION => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $postDataJson,
    ];

    curl_setopt_array($curl, $opts);

    // response of the POST request

    $response = curl_exec($curl);

    $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);

    $responseBody = json_decode($response);

    curl_close($curl);

    return $httpCode;

}

$header = array("Content-Type:application/json", "Accept:application/json");

$fichier = 'requette.xml';

$lien = 'https://10.0.0.80/json';
$request = array( "method" => "switchvox.currentCalls.getList" );
$parameters = array();
$postData = array(
    "request" => $request
);
// encoding object
$postDataJson = json_encode($postData);

//print_r($postDataJson);

$httpCode = do_post_request($lien, $header, $postDataJson);

if ($httpCode >= 200 && $httpCode < 300) {
echo 'ca marche';
}else {

code...

echo $httpCode;

}
?>

Quand j'execute mon script, j'obtiens "0" !!!
Je ne s'ais pas là ou ca bloc !

Pouvez m'aidez a faire fonctionner mon code ?
Merci !!!

11 réponses

keulu, il y a 8 ans

ton $response vaut quoi ? Faut y aller étape par étape. si j'etais toi, j'enleverai tout ce qui peut faire que ca marche pas. (pour l'instant)

  • CURLOPT_CONNECTTIMEOUT => 2,
  • CURLOPT_MAXREDIRS => 2,
  • CURLOPT_COOKIESESSION => true,
Ouedraogo Mahomed, il y a 8 ans

Bonjour !
Merci de se pencher sur ma question!
ma variable $response vaut "0" quand j'essai d'executer mon code !

J'essaierai d'enlever les ligne que tu suggrer et je vous reviens !!!
Merci

keulu, il y a 8 ans

c'est pas ton $httpCode qui vaut 0 ?

Ouedraogo Mahomed, il y a 8 ans

hooopppp !!!! excusez moi ! c plutot la var $httpCode qui vaut 0 !!!
J'ai pas eu l'idée de verifier ce que la variable $response vaut !
Je le fais tous de suite et je vous reviens !!!

Ouedraogo Mahomed, il y a 8 ans

Je viens donc d'enlever les ligne:
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_MAXREDIRS => 2,
CURLOPT_COOKIESESSION => true,

et verifier la valeur de la variable $response
Mais toujour mon code ne fonctionne pas !

avec un return $response, ca m'affiche rien ! une page blanche !

Ouedraogo Mahomed, il y a 8 ans

J'ai trouvé des piste que je voudrais partagé peut etre que ca aiderais au autres pour qu'il puisse m'aider !!!

  • j'ai rajouter une autre fonctionalité cURL: CURLOPT_SSL_VERIFYPEER => false, pour eviter les histoires de certificat
    quand je reexecute mon code, toujour la variable $response est vide: affiche rien. la variable $httpCode m'affiche toujour "0"
  • poursuivant mes recherche, j'ai trouvé une autre fonction de cURL qui permet d'afficher les erreur:
    if (curl_error($curl)) {
    $curl_error = curl_error($curl);
    }
    quand je place cette fonction mon code devient:
    function do_post_request($lien, $header, $postDataJson){
    $curl = curl_init();

    $opts = [
        CURLOPT_URL => $lien,
        CURLOPT_HTTPHEADER =>$header,
        CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
        CURLOPT_USERPWD => "admin:admin",
        CURLOPT_SSL_VERIFYPEER => false,
        //CURLOPT_CONNECTTIMEOUT => 2,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => TRUE,
        //CURLOPT_MAXREDIRS => 2,
        //CURLOPT_COOKIESESSION => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $postDataJson,
    ];
    
    curl_setopt_array($curl, $opts);
    
    // response of the POST request
    
    $response = curl_exec($curl);
    
    $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    
    $responseBody = json_decode($response);
    
    if (curl_error($curl)) { 
       $curl_error =  curl_error($curl); 
    }
    
    curl_close($curl);
    
        //return $httpCode;
        //return $opts;
        //return $response;
        return $curl_error;

    }

    $header = array("Content-Type:application/json", "Accept:application/json");

    $fichier = 'requette.xml';

    $lien = 'https://10.0.0.80/json';

    $request = array( "method" => "switchvox.currentCalls.getList" );
    $parameters = array();
    $postData = array(
    "request" => $request
    );
    // encoding object
    $postDataJson = json_encode($postData);

    //print_r($postDataJson);

$httpCode = do_post_request($lien, $header, $postDataJson);

if ($httpCode >= 200 && $httpCode < 300) {
echo 'mosbi';
}else {

code...

echo $httpCode;

}
et resultat:
return $httpCode; m'affiche 0
return $response; m'affiche rien
return $curl_error; m'affiche " SSL: no alternative certificate subject name matches target host name '10.0.0.80' "

si j'enleve alors la fonction " CURLOPT_SSL_VERIFYPEER => false " et que je rexecute mon code, la variable:
$curl_error m'affiche " SSL certificate problem: self signed certificate in certificate chain "

quelqu'un aurait une idée pour palier a ca ou pour la creation d'un alternative certificate ?

Merci pour votre aide!

keulu, il y a 8 ans

tu as aussi ca pour tester

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

sinon, j'ai remarqué que tu appelle ton ip avec https. tu peux pas l'appeler avec http ?

$lien = 'https://10.0.0.80/json';

Huggy, il y a 8 ans

Je vois que beaucoup utilisent cURL: CURLOPT_SSL_VERIFYPEER => false,
cela veut dire que l'autorité qui a certifié le certificat n'est pas verifiée, (un certificat auto-signé est vu comme ok)
Si vous avez des problèmes de vérification des CA, pensez à mettre à jour votre fichier cacert.pem
vous pouvez le télécharger sur le site Mozilla et il y a même un outils pour l'extraire de votre navigateur moziilla.

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE); curl_setopt($ch, CURLOPT_CAINFO, "/path/to/cacert.pem");
Ouedraogo Mahomed, il y a 8 ans

Bonsoir !
Oui effectivement j'approuve votre solution, sauf que apparement je suis obligé de lancer mon apps avec seulement que mozilla ?
et aussi, a chaque fois que mozilla met le certificat a jour il faut que je me rappel pour remettre mon application a jour ?
si joubli d'effectuer cette operation regulieremnt mon apps bugguera tous le temps qu'il faut ?

Je teste votre solution, mais je m'active a configurer un certificat auto signer
Merci !

Ouedraogo Mahomed, il y a 8 ans

Ooooohhh juste !!!
Mr Keulu, mon code a fonctionné !!!
il ne manquais que cette ligne a ajouter apres la desactivation du controle ssl
Donc en resumer il faut les deux ligne combiner pour eviter l'errer " SSL: no alternative certificate subject name matches target host name "
du coup ca m'evite la configuration de certificat auto signé !
je remet ma fonction complete pour ceux que ca peut aider !
https://hastebin.com/utuqubakaq.php
Merci !