PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2024 → Passer du PHP vers Windev
Passer du PHP vers Windev
Iniciado por Cyril, 19,jul. 2018 14:37 - 7 respuestas
Publicado el 19,julio 2018 - 14:37
Bonjour à tous (et toutes)
Nous développons beaucoup en PHP ou C# mais depuis quelques mois nous avons découvert Windev V23, c’est super rapide et agréable.
Nous rencontrons un problème bloquant … Lié à notre manque d’expertise sous Windev (mais pas au niveau compétence développement).
Nous essayons, sans succès (malgré toutes les recherche sur google…) de transformer un script PHP en Windev pour utiliser une API d’un fournisseur d’OCR. Impossible d’arriver à faire cette opération, hors il semble bien que Windev soit en mesure de faire « la même chose » qu’en PHP. Si l’un d’entre vous peut nous mettre sur le « bon chemin » …
Je vous donne un exemple de ce que nous devons faire en Windev (exemple PHP générique de l’éditeur de l’API)
Merci d’avance
Cdlt
Cyril
$key1     = 'XXXXXXXXXXXXXXX';
    $key2     = 'XXXXXXXXXXXXXXX';
    
    $apiId         = 'XXXXX-XXXXX-XXXXX-XXXXX-XXXXX';
    $apiPassword     = 'XXXXXXXXXXXXXXX';

    $fileName         = 'test1.jpg';
    $userAgent         = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0";

    $serviceUrl = 'https://www.ocrmobile.cloud/public/api/';
    
    // get valid token to send treatment / valid during 3600 seconds
    $urlAuthenticate     = $serviceUrl.'authenticate/'.$key1.'::'.$key2;
    // post scan or crop 
    $urlTreat             = $serviceUrl.'process/{token}';
    // get result
    $urlResult             = $serviceUrl.'getResult/{processId}/{token}';
    
    // Get path to file that we are going to recognize
    $filePath = "C:\\".$fileName;
        // $filePath ="/var/www/html/ocr-smartphone.com/dev/".$fileName;
        
        if(!file_exists($filePath))
        {
            die('File '.$filePath.' not found.');
        }
        
        if(!is_readable($filePath) )
        {
            die('Access to file '.$filePath.' denied.');
        }
        
    // 1. first step authenticate to get valid token for use api

    $curlHandle = curl_init();
    curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, false);    
    curl_setopt($curlHandle, CURLOPT_URL, $urlAuthenticate);
    curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curlHandle, CURLOPT_USERPWD, "$apiId:$apiPassword");
    curl_setopt($curlHandle, CURLOPT_POST, 0);
    curl_setopt($curlHandle, CURLOPT_USERAGENT, $userAgent);
    curl_setopt($curlHandle, CURLOPT_FAILONERROR, true);
    $response = curl_exec($curlHandle);

        if($response == FALSE) {
            
            $errorText = curl_error($curlHandle);
            curl_close($curlHandle);
            die("authenticate error ".$errorText);
        
        }    
         
    $httpCode = curl_getinfo($curlHandle, CURLINFO_HTTP_CODE);
    curl_close($curlHandle);
        
        // reponse type JSON {"access":true,"token":"12346578","expires":3600}
        $jsonAuthenticate = json_decode($response,true);
        
        if($jsonAuthenticate["access"]){
            
                $token         = $jsonAuthenticate["token"];
                $urlTreat     = str_replace("{token}",$token,$urlTreat);
                $urlResult     = str_replace("{token}",$token,$urlResult);
                $urlBinaryImage     = str_replace("{token}",$token,$urlBinaryImage);
                
        }else{
            
            die("No access ".$jsonAuthenticate["error"]);
            
        }

    //
    //
    //
    //    
    // 2. Send HTTP POST request and return JSON response


    $curlHandle = curl_init();
    curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, false);    
    curl_setopt($curlHandle, CURLOPT_URL, $urlTreat);
    curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curlHandle, CURLOPT_USERPWD, "$apiId:$apiPassword");
    curl_setopt($curlHandle, CURLOPT_POST, 1);
    curl_setopt($curlHandle, CURLOPT_USERAGENT, $userAgent);
    curl_setopt($curlHandle, CURLOPT_FAILONERROR, true);
    
    $post_array = array();

      if((version_compare(PHP_VERSION, '5.5') >= 0)) {
        $post_array["my_file"] = new CURLFile($filePath);
      } else {
        $post_array["my_file"] = "@".$filePath;
      } 
    
    // send params JSON see documentation datas.pdf
    $post_array["processJson"] = '{"supportId":1,"taxes":[2.1,5.5,10,20],"task":"scan","language":"FR","fileName":"'.$fileName.'","type":"img","srcCount":1,"useCrop":true}';
  
    curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $post_array); 
    $response = curl_exec($curlHandle);
    
      if($response == FALSE) {
          
        $errorText = curl_error($curlHandle);
        curl_close($curlHandle);
        die("response false ".$errorText);
        
      }    
      
    curl_close($curlHandle);
        
    $jsonProcessResponse  = json_decode($response,true);
    
        if($jsonProcessResponse["access"]){
            
            if(isset($jsonProcessResponse["error"])){
                
                die("Error ".$jsonResult["error"]);            
            }
            
            else{
                // get processId for request result
                $processId  = $jsonProcessResponse["processId"];
                //replace params for url getResult
                $urlResult     = str_replace("{processId}",$processId,$urlResult);
                                
            }

        }else{
            
            die("No access ".$jsonResult["error"]);
        }    
    
    
//getResult process

while(true)
  {
    sleep(1); // important
    $curlHandle = curl_init();
    curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, false);    
    curl_setopt($curlHandle, CURLOPT_URL, $urlResult );
    curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curlHandle, CURLOPT_USERPWD, "$apiId:$apiPassword");
    curl_setopt($curlHandle, CURLOPT_USERAGENT, $userAgent);
    curl_setopt($curlHandle, CURLOPT_FAILONERROR, true);
    $response = curl_exec($curlHandle);
    $httpCode = curl_getinfo($curlHandle, CURLINFO_HTTP_CODE);
    curl_close($curlHandle);
  
    $jsonResult = json_decode($response, true);
    
    if($httpCode != 200) {
     
        die("Unexpected response getResult ".$response);
        
    }
    
    if($jsonResult["access"]){
        
        if($jsonResult["status"] == "ok"){
            
            // result of the process in the field name "result"
            echo $response;
                                    
            break;
            
        }else if($jsonResult["status"] == "failed" || $jsonResult["status"] == "failed_"){
            
             die("treatment fail ".implode("
",$jsonResult));
            
        }else if($jsonResult["status"] == "inProgress"){
            
             continue;
            
        }
        
    }else{
        
        die("No access ".$jsonResult["error"]);
             
    }

    
  }
?>
Miembro registrado
2.572 mensajes
Popularité : +222 (260 votes)
Publicado el 19,julio 2018 - 16:22
Bonjour,

Un bout de piste (désolé je n'ai pas trop de temps à y consacrer, le script est long). Tu peux aussi rajouter des entêtes supplémentaires avec la propriété "Entête" qui est un tableau associatif.

sKey1 est une chaîne = "XXXXXXXXXXXXXXX"
sKey2 est une chaîne = "XXXXXXXXXXXXXXX"
sApiId est une chaîne = "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX"
sApiPassword est une chaîne = "XXXXXXXXXXXXXXX"
sFileName est une chaîne = "test1.jpg"

MaRequete est un httpRequête
MaRequete.AgentUtilisateur = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0"
MaRequete.ContentType = typeMimeJPEG
MaRequete.Méthode = httpPost
MaRequete.URL = "https://www.ocrmobile.cloud/public/api/"+...

MaReponse est httpRéponse = HTTPEnvoie(MaRequete)


Pour le json tu as jsonVersVariant(). Tu peux créer une structure devant recevoir le json pour bénéficier de la completion auto.

--
Cordialement,

Philippe SAINT-BERTIN
Mensaje modificado, 19,julio 2018 - 16:35
Publicado el 19,julio 2018 - 16:25
Merci Philippe !
Désolé, j'ai fait un copié collé complet d'un exemple, à présent j'ai une piste.
Je te tiendrai au courant
Cdlt
Cyril
Publicado el 19,julio 2018 - 17:14
Philippe
SI tu le permet je t'enverrai mon code WinDev et mon code PHP, je viens de m'apercevoir que je n'avais pas envoyé le bon (vivement septembre pour les vacances). Je cale sur la partie authentification ! qui ne fait que 12 lignes de PHP ...
Le code est bon en PHP (utilisé depuis 2 ans) mais pas si simple à transposer. J'y travaille ce soir et je me permettrai de faire un post demain matin
Cdlt
Cyril
Publicado el 19,julio 2018 - 21:07
Bonsoir
J'ai fait X tentatives pour appliquer vos conseils … Mais je sèche toujours ….
Je vais continuer à creuser … Mais si vous pouvez continuer avec vos précieux conseils
Mille merci
Cdlt
Cyril

Voici ma requête PHP qui fonctionne ….
$key1 = 'XXXXXXXXXXXXXXX';
$key2 = 'XXXXXXXXXXXXXXX';
$apiId = 'XXXX-XXXX-XXXX-XXXX-XXXX';
$apiPassword = 'XXXXXXXXXXXXXXX';
$userAgent = 'myUserAgent';
$urlAuthenticate = 'https://www.ocrmobile.cloud/public/api/authenticate/'.$key1.'::'.$key2;
$curlHandle = curl_init();
curl_setopt($curlHandle, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curlHandle, CURLOPT_URL, $urlAuthenticate);
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curlHandle, CURLOPT_USERPWD, "$apiId:$apiPassword");
curl_setopt($curlHandle, CURLOPT_POST, 0);
curl_setopt($curlHandle, CURLOPT_USERAGENT, $userAgent);
curl_setopt($curlHandle, CURLOPT_FAILONERROR, true);
$response = curl_exec($curlHandle);$response = curl_exec($curlHandle);
if($response == FALSE) {
$errorText = curl_error($curlHandle);
curl_close($curlHandle);
die($errorText);
}
$httpCode = curl_getinfo($curlHandle, CURLINFO_HTTP_CODE);
curl_close($curlHandle);


//ET voici mon début de code WinDev qui lui "plante" …. (messages erreurs dans MaReponse, ou je dois trouver la valeur 200
ApiId est une chaîne = "Y6N0H-5KJA4-03OH6-PE0J6-XXXXX"
ApiPassword est une chaîne = "ETPJOLFDQXXXXX"
ChaineURL est une chaîne =""
MaRequete est un httpRequête
MaReponse est une httpRéponse

MaRequete.AgentUtilisateur = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0"
MaRequete.ContentType = typeMimeJPEG
MaRequete.Méthode = httpPost
MaRequete.URL ="https://www.ocrmobile.cloud/public/api/authenticate/"+key1+"::"+key2

MaRequete..Entête["SSL_VERIFYHOST"] = "2"
MaRequete..Entête["SSL_VERIFYPEER"] = "false"
MaRequete..Entête["RETURNTRANSFER"] = "1"
MaRequete..Entête["USERPWD"] = ApiId+":"+ApiPassword // Ou bien MaRequete.Utilisateur=ApiId et MaRequete.MotDePasse=ApiPassword ??
MaRequete..Entête["USERAGENT"] = "myUserAgent"
MaRequete..Entête["FAILONERROR"] = "true"

MaReponse = HTTPEnvoie(MaRequete)
Publicado el 20,julio 2018 - 09:03
Bonjour Philippe
Ca y est, j'ai trouvé, après une nuit de sommeil la "lumière" est apparue grâce à tes conseils
Merci
Excellente journée
Cdlt
Cyril
Miembro registrado
6 mensajes
Popularité : +1 (1 vote)
Publicado el 11,octubre 2021 - 11:24
Bonjour,

J'ai le même problème que vous, avez-vous la réponse finalement ?

Bien cordialement,

--
---------------------------------------
François Verney
http://www.verney.fr
Miembro registrado
2.572 mensajes
Popularité : +222 (260 votes)
Publicado el 11,octubre 2021 - 15:04
@François VERNEY: Quel problème ???

--
Cordialement,

Philippe SAINT-BERTIN