PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → PHP POST vers Windev
PHP POST vers Windev
Iniciado por Cyril, jul., 20 2018 11:36 AM - 10 respostas
Publicado em julho, 20 2018 - 11:36 AM
RE bonjour
Un add on à ma demande d'hier (encore merci Philipe pour m'avoir mis sur la voie).
Je n'ai plus de soucis avec mes requêtes GET mais je stoppe sur les requêtes POST.

Je vous joint mon code PHP POST .. Ainsi que ma transcription en WinDev, qui ne fonctionne pas. Message d'erreur de l'API "Variable processJson not set".

Merci d'avance pour votre aide

Procedure PostFile(ValToken)
PostFile est une httpRequête
PostResult est une httpRéponse

PostFile..AgentUtilisateur = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0"
PostFile..Méthode = httpPost

PostFile..URL ="https://www.ocrmobile.cloud/public/api/process/"+ValToken
PostFile..Entête["RETURNTRANSFER"] = "1"
PostFile..Utilisateur=ApiId
PostFile..MotDePasse=ApiPassword
PostFile..Entête["my_file"]="c:\temp\invoice.pdf"
PostFile..Entête["processjson"]="{supportId:2,taxes:[2.1,5.5,10,20],task:scan,country:FR,language:FR,fileName:invoice.pdf,type:pdf,srcCount:1,useCrop:true}"
PostFile..ContentType="{supportId:2,taxes:[2.1,5.5,10,20],task:scan,country:FR,language:FR,fileName:invoice.pdf,type:pdf,srcCount:1,useCrop:true}"
PostResult = HTTPEnvoie(PostFile)
Info(PostResult..Contenu)


LE CODE PHP 
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();
$post_array["my_file"] = "@".$filePath;
$post_array["processJson"] =
'{"supportId":2,"taxes":[2.1,5.5,10,20],"task":"scan","country":"FR","language":"FR",
"fileName":"'.$fileName.'","type":"img","srcCount":1,"useCrop":true}';

curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $post_array);
Membro registado
939 mensagems
Popularité : +66 (68 votes)
Publicado em julho, 20 2018 - 12:02 PM
bonjour,

je pense qu'il faut simplement utiliser la propriété ..Contenu de votre HTTPRequete et non pas ContentType qui lui défini le type de contenu ( qui dans votre cas semble être "application/json" )

à tester...

bon dèv ;)
Mensagem modificada, julho, 20 2018 - 12:02 PM
Membro registado
55 mensagems
Popularité : +3 (3 votes)
Publicado em julho, 20 2018 - 12:34 PM
Bonjour Christophe
Merci du retour. J'ai bien modifié comme indiqué (voir code ci-dessous). Toujours la même erreur.

Comme je l'indiqué hier dans mon premier post, je travaille depuis des années sur PHP et C#, j'ai découvert Windev23 il y a quelques mois c'est vraiment top comme outil mais je (nous en fait car nous sommes 3) galère pas mal pour m'habituer à la syntaxe autour des connexions API, WebService .. Mais cela va venir !
PostFile..AgentUtilisateur = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0"
PostFile..Méthode = httpPost

PostFile..URL ="https://www.ocrmobile.cloud/public/api/process/"+ValToken
PostFile..Entête["RETURNTRANSFER"] = "1"
PostFile..Utilisateur=ApiId
PostFile..MotDePasse=ApiPassword
PostFile..Entête["my_file"]="c:\temp\invoice.pdf"
PostFile..Contenu="{supportId:2,taxes:[2.1,5.5,10,20],task:scan,country:FR,language:FR,fileName:invoice.pdf,type:pdf,srcCount:1,useCrop:true}"
PostFile..ContentType=typeMimeJSON
PostResult = HTTPEnvoie(PostFile)
Membro registado
2.566 mensagems
Popularité : +222 (260 votes)
Publicado em julho, 20 2018 - 3:24 PM
Bonjour,
Ton JSON est faux tout simplement. De la même manière qu'en php, tes membres doivent être encadré par des doubles quotes ains que tes valeurs de type chaine.

Il faut faire ça
sContent est une chaîne=[
{"supportId":2,"taxes":[2.1,5.5,10,20],"task":"scan","country":"FR","language":"FR","fileName":"invoice.pdf","type":"pdf","srcCount":1,"useCrop":True}
]
PostFile..Contenu=sContent


C'est saisi à la volée, mais l'idée est là.

--
Cordialement,

Philippe SAINT-BERTIN
Membro registado
55 mensagems
Popularité : +3 (3 votes)
Publicado em julho, 20 2018 - 3:27 PM
Re bonjour ... J'avance et merci pour vos conseils mais j'ai encore beaucoup de mal avec la syntaxe WinDev. Voici à présent ce que j'obtiens en retour de ma requête POST... Si vous pouvez me faire un troubleshooting ... Je commence à tourner en rond !
Mille merci
J'ai ajouté mon code et le printscreen en retour de l'API





Procedure PostFiles(ValToken)
AnsiChaine est une chaîne ANSI = [
processJson=
{"supportId":2,
"taxes":[2.1,5.5,10,20],
"task":"scan",
"country":"FR",
"language":"FR",
"fileName":"c:\temp\invoice.pdf",
"type":"pdf",
"srcCount":1,
"useCrop":True}
]
JsonChaine est un Buffer = ChaîneVersUTF8(AnsiChaine)

PostFile est une httpRequête
PostResult est une httpRéponse

PostFile..AgentUtilisateur = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0"
PostFile..Méthode = httpPost

PostFile..URL ="https://www.ocrmobile.cloud/public/api/process/"+ValToken
PostFile..Entête["RETURNTRANSFER"] = "1"
PostFile..Utilisateur=ApiId
PostFile..MotDePasse=ApiPassword
PostFile..Entête["my_file"]="c:\temp\invoice.pdf"
PostFile..Contenu=JsonChaine

PostResult = HTTPEnvoie(PostFile)
Info(PostResult..Contenu)
Membro registado
948 mensagems
Popularité : +30 (92 votes)
Publicado em julho, 20 2018 - 3:38 PM
Coucou,

AnsiChaine est une chaîne ANSI = [
processJson=
{"supportId":2,
"taxes":[2.1,5.5,10,20],
"task":"scan",
"country":"FR",
"language":"FR",
"fileName":"c:\temp\invoice.pdf",
"type":"pdf",
"srcCount":1,
"useCrop":True}
]


VariantVersJSON
https://doc.pcsoft.fr/?1000021051


Consommer un webservice REST/JSON depuis une application WINDEV
https://www.youtube.com/watch?v=LTVZC2jOV3U


--
In üs we trust - #92i
Mensagem modificada, julho, 20 2018 - 3:40 PM
Membro registado
55 mensagems
Popularité : +3 (3 votes)
Publicado em julho, 20 2018 - 4:41 PM
Merci Charly
J'ai appliqué la modif proposé, même erreur. Si vous le désirez je peux vois envoyer mes ID pour tester (ainsi que le code) via email.
En // je vais regarder la vidéo proposée.
Ces galères me rappelle mes débuts en PHP ... Cela me rajeunis !!
Cdlt
Membro registado
948 mensagems
Popularité : +30 (92 votes)
Publicado em julho, 20 2018 - 5:12 PM
Coucou,

Envoie toute les infos nécésaire, je te le fait ^^

#Promo #Friday


charly.cando.anywhere@gmail.com


--
In üs we trust - #92i
Mensagem modificada, julho, 20 2018 - 5:13 PM
Membro registado
55 mensagems
Popularité : +3 (3 votes)
Publicado em julho, 20 2018 - 5:27 PM
Merci pour la promo du Vendredi !
Je t'envoie les infos
Membro registado
948 mensagems
Popularité : +30 (92 votes)
Publicado em julho, 21 2018 - 2:40 PM
Coucou,

// https://www.ocrmobile.com/
COCRMobile est une Classe
GLOBAL
PUBLIC
CONSTANT
URL = "https://www.ocrmobile.cloud/public/api/"
AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0"
FIN
LOCAL
PRIVÉE
// OCR Internal
m_arrKeys est un tableau de chaîne
// Unique API IDentifier
m_sUAID est une chaîne
m_sPassword est une chaîne
// Token
m_sToken est une chaîne
// Internal
// Define the characteristics of a REST request.
m_xRequest est un restRequest
// Define all the advanced characteristics of a REST response.
m_xResponse est un restRéponse
FIN


Procedure PUBLIC Authenticate(): boolean
// Automatic behavior
ErreurChangeParamètre(epGotoCasErreur)
ExceptionChangeParamètre(epGotoCasException)
// Automatic value return at the end of the procedure
RETOUR = Faux
// RAZ
VariableRAZ(:m_xRequest)
VariableRAZ (:m_xResponse)
:Token = ""
// Authenticate
AVEC :Request
..URL = ::URL + "authenticate/" + TableauVersChaîne(object:Keys, "::")
..Méthode = httpGet
..AgentUtilisateur = ::AGENT
..Utilisateur = object:UAID
..MotDePasse = object:Password
FIN
// Get the token
:m_xResponse = RESTEnvoie(:m_xRequest)
_vResponse est un Variant = JSONVersVariant(:Response.Contenu)
// Check
SELON Vrai
CAS _vResponse.access = "Faux"
ErreurDéclenche(1, "authenticate error : [%VariantVersJSON(_vResponse)%]")
RENVOYER Faux
AUTRE CAS
// Put here other check condition
FIN
// Save the token
:Token = _vResponse.token
// Summary
RENVOYER Vrai
// Error management
CAS ERREUR:
ErreurPropage()
CAS EXCEPTION:
ExceptionPropage()
FIN:
// RAZ
VariableRAZ(:m_xRequest)
VariableRAZ (:m_xResponse)


Procedure PUBLIC ExecuteRequest(_sFilename est une chaîne): chaîne
// Automatic behavior
ErreurChangeParamètre(epGotoCasErreur)
ExceptionChangeParamètre(epGotoCasException)
// Automatic value return at the end of the procedure
RETOUR = ""
// check condition
SELON Vrai
CAS PAS fFichierExiste(_sFilename)
ErreurDéclenche(1, "[%_sFilename%] not found.")
RENVOYER ""
AUTRE CAS
// Put here other check condition
FIN
// Param
_vPost est un Variant
// TODO: Add this value in member / property in the class
AVEC _vPost
.supportId = 1
.taxes = [2.1,5.5,10,20]
.task = "scan"
.language = "FR"
.country = "FR"
.fileName = fExtractPath(_sFilename, fFileName)
.type = "img"
.srcCount = "1"
.useCrop = True
FIN
// Form
_sUIDForm est une chaîne = DonneGUID(guidBrut)
HTTPCréeFormulaire(_sUIDForm)
HTTPAjouteParamètre(_sUIDForm, "processJson", VariantVersJSON(_vPost))
HTTPAjouteFichier(_sUIDForm, "my_file", _sFilename)
HTTPEnvoieFormulaire(_sUIDForm, ... // Name of HTTP form to send.
::URL + "process/" + objet:Token, ... // URL to Contact
httpPost, ... // HTTP Method
::AGENT, ... // User Agent
"", ... // Additional HTTP Header
typeMimeFormulaireMultiPartie, ... // Type of Form
:UAID, ... // User Name
:Password ... // Password
)
_vResponse est un Variant = JSONToVariant(HTTPDonneRésultat(httpRésultat))
// Check
SELON Vrai
CAS _vResponse.access = "Faux"
ErreurDéclenche(1, "response false [%VariantVersJSON(_vResponse)%]")
RENVOYER ""
AUTRE CAS
// Put here other check condition
FIN
// Process ID
_IDProcess est une chaîne = _vResponse.processId
// RAZ
VariableRAZ(:m_xRequest)
// Authenticate
AVEC :Request
..URL = ::URL + "getResult/[%_IDProcess%]/[%objet:Token%]"
..Méthode = httpGet
..AgentUtilisateur = ::AGENT
..Utilisateur = object:UAID
..MotDePasse = object:Password
FIN
// Process
BOUCLE
// RAZ
VariableRAZ(:m_xResponse)
// Get the token
:m_xResponse = RESTEnvoie(:m_xRequest)
_vResponse = JSONVersVariant(:Response.Contenu)
// Response
AVEC _vResponse
SELON Vrai
CAS .status = "todo" _OU_ .status = "inProgress"
Multitâche(-1)
CONTINUE
CAS PAS .access
ErreurDéclenche(1, "No access : [%:Response.Contenu%]")
RENVOYER ""
CAS ChaîneCommencePar(.status, "failed")
ErreurDéclenche(1, "treatment fail [%:Response.Contenu%]")
RENVOYER ""
CAS .status = "ok"
RENVOYER VariantVersJSON(.result)
AUTRE CAS
ErreurDéclenche(1, "Unknown response: [%:Response.Contenu%]")
RENVOYER ""
FIN
FIN
FIN
// Summary
RENVOYER ""
// Error management
CAS ERREUR:
ErreurPropage()
CAS EXCEPTION:
ExceptionPropage()
FIN:
// RAZ
VariableRAZ(:m_xRequest)
VariableRAZ (:m_xResponse)


// Automatic behavior
ErreurChangeParamètre(epGotoCasErreur)
ExceptionChangeParamètre(epGotoCasException)
_sFilename est une chaîne = TonFichier
_sResult est une chaîne

_clCOCRMobile est un COCRMobile
AVEC _clCOCRMobile
// Informations de connections
:Keys = ["", ""]
:UAID = ""
:Password = ""
// Authenticate
:Authenticate()
// Request
_sResult = :ExecuteRequest(_sFilename)
FIN
// Result
Info(_sResult)
// Summary
CAS ERREUR:
Erreur(ErreurInfo(errComplet))
CAS EXCEPTION:
Erreur(ExceptionInfo(errComplet))


#WLoodies #LaPiraterieNEstJamaisFinie #Gotham #Sale #92i


--
In üs we trust - #92i



Mensagem modificada, julho, 21 2018 - 2:44 PM
Publicado em julho, 23 2018 - 1:13 PM
Un grand merci à Charly qui m'a envoyé ce code durant le WE !!