Effectivement, ça complique. De plus il est possible que le PHP fasse d'autres vérifications avant d'accepter le fichier.
Autre solution: As-tu essayé avec Curl ? (à invoquer avec RunProgram)
[RESOLU] Communiquer avec un formulaire HTTP
Re: Communiquer avec un formulaire
Merci, je vais regarder.
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5
PureBasic 6.11 MacOS
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5
PureBasic 6.11 MacOS
[RESOLU] Communiquer avec un formulaire
Bonjour,
Après de nombreuse recherches et de lecture de doc, j'ai sortie l'artillerie soit Postman, pour la création de requêtes et Wireshark pour capturer la communication.
Sur les forum purebasic, j'ai trouvé des pistes, mais rien ne fonctionnait avec PB 6.0.
Avec Postman, j'ai validé la structure de la métope POST. Il la présente dans la console au format raw, c'est très pratique
Avec Wireshark, J'ai observé que SendNetworkData ouvre une connexion TCP mais ne fait pas de transmission HTTP d'ou l'erreur en réponse.
La solution, Je l'ai remplacé par SendNetworkString qui fait bien une connexion HTTP.
Cela m'a permis de bien corriger ma requête préparé en PB et le tout fonctionne à merveille. J'ai un doute sur le calcul du paramètre 'Content-Length' car différent de celui créer par Postman mais ca fonctionne. Je n'ai pas trouvé de documentation (même dans la RFC2616 ou autre).
Si vous avez une info, je suis preneur.
J'ai laissé mon site test ouvert pour les curieux. et voici le code du test un peu documenté. J'ai ajusté les buffer et les temps pour optimiser la com.
en réponse, on peut observer la bonne interprétation des variable :
<pre>post<br />Array
(
[testpost1] => 12345
[testpost2] => 54321
)
get<br />Array
(
)
file<br />Array
(
[Nameparameter] => Array
(
[name] => test.xml
[type] =>
[tmp_name] => /mnt/108/sdb/e/e/bmaillard/phpwkQ4Z5
[error] => 0
[size] => 6
)
)
Merci de votre aide
Après de nombreuse recherches et de lecture de doc, j'ai sortie l'artillerie soit Postman, pour la création de requêtes et Wireshark pour capturer la communication.
Sur les forum purebasic, j'ai trouvé des pistes, mais rien ne fonctionnait avec PB 6.0.
Avec Postman, j'ai validé la structure de la métope POST. Il la présente dans la console au format raw, c'est très pratique
Avec Wireshark, J'ai observé que SendNetworkData ouvre une connexion TCP mais ne fait pas de transmission HTTP d'ou l'erreur en réponse.
La solution, Je l'ai remplacé par SendNetworkString qui fait bien une connexion HTTP.
Cela m'a permis de bien corriger ma requête préparé en PB et le tout fonctionne à merveille. J'ai un doute sur le calcul du paramètre 'Content-Length' car différent de celui créer par Postman mais ca fonctionne. Je n'ai pas trouvé de documentation (même dans la RFC2616 ou autre).
Si vous avez une info, je suis preneur.
J'ai laissé mon site test ouvert pour les curieux. et voici le code du test un peu documenté. J'ai ajusté les buffer et les temps pour optimiser la com.
Code : Tout sélectionner
;sources
;https://www.purebasic.fr/english/viewtopic.php?t=19714
;https://www.purebasic.fr/french/viewtopic.php?t=14753
;https://www.pierre-giraud.com/http-reseau-securite-cours/requete-reponse-session/
Procedure.s SendPost()
Debug SetCurrentDirectory("/Users/bertrand/Mon Drive/PureBasic/Lagardere" )
Debug "repertoire actuel "+ GetCurrentDirectory()
FullFileName$ = "test.xml" ; Full path+filename, choose your own path
OpenFile(1,FullFileName$)
Repeat
Text$ = ReadString(1)
FILE$ + Text$ + #CRLF$
Until Eof(1)
;Debug ">"+FILE$ + " >>> "+Len(file$)
LenString$=Str(Len(PostData$))
port.i = 80
Timeout = 100 ; à ajuster pour assurer un retour complet
server$ = "bmaillard.free.fr"
QT$=Chr(34)
com$ = "POST /greg/envoyer.php HTTP/1.1"+#CRLF$
com$ + "User-Agent: PostmanRuntime/7.30.0"+#CRLF$
com$ + "Accept: */*"+#CRLF$
com$ + "Postman-Token: ce034460-714f-40db-99ba-df45516d14ed"+#CRLF$
com$ + "Host: bmaillard.free.fr"+#CRLF$
com$ + "Accept-Encoding: gzip, deflate, br"+#CRLF$
com$ + "Connection: keep-alive"+#CRLF$
com$ + "Content-Type: multipart/form-data; boundary=--------------------------329524634601592690113207"+#CRLF$
PostData$ = "----------------------------329524634601592690113207"+#CRLF$
PostData$ + "Content-Disposition: form-data; name="+QT$+"Nameparameter"+QT$+"; filename="+QT$+"test.xml"+QT$+#CRLF$
PostData$ + #CRLF$
PostData$ + file$
PostData$ + "----------------------------329524634601592690113207"+#CRLF$
PostData$ + "Content-Disposition: form-data; name="+QT$+"testpost1"+QT$+#CRLF$
PostData$ + #CRLF$
PostData$ + "12345"+#CRLF$
PostData$ + "----------------------------329524634601592690113207"+#CRLF$
PostData$ + "Content-Disposition: form-data; name="+QT$+"testpost2"+QT$+#CRLF$
PostData$ + #CRLF$
PostData$ + "54321"+#CRLF$
PostData$ + "----------------------------329524634601592690113207--"+#CRLF$
com$ + "Content-Length:"+Len(PostData$)+#CRLF$ ; je ne suis pas sur de ce parametre , mais il fonctionne
com$ + #CRLF$
com$ + PostData$
;Debug ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+ Len(com1$)
ConnectionID = OpenNetworkConnection(Server$, port.i,#PB_Network_TCP)
If ConnectionID
;Res = SendNetworkData(ConnectionID,@com$,Len(com$)) ; pas de HTTP ?
Res= SendNetworkString(ConnectionID, com$ ,#PB_Ascii) ; HTTP
Debug ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> début requete méthode POST >>>>>>>>>>>>>>>>>>>>>>"
Debug com$
Debug ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fin de requète >>>>>>>>>>>>>>>>>>>>>>"
Delay(100) ; attende de la réponse
r$ = Space(8000) ; max UDP 65000 évite de gérer un buffer plus petit
d = ElapsedMilliseconds()
; lit la reception jusqu'a timeout et retour la réponse
Repeat
Result = NetworkClientEvent(ConnectionID)
If result
receivLen = ReceiveNetworkData(ConnectionID,@r$,Len(r$))
If receivLen < 0 ; probleme lors de la connexion
ProcedureReturn "Un problème est survenu"
EndIf
If receivLen > 0 And receivLen <= Len(r$)
d = ElapsedMilliseconds()
buffer$ + PeekS(@r$, receivLen, #PB_UTF8|#PB_ByteLength) ; lecture correcte du retour
EndIf
EndIf
Tm = ElapsedMilliseconds()-d
Until Tm > Timeout ; garantir fin de transmission
CloseNetworkConnection(ConnectionID)
ProcedureReturn buffer$
EndIf
EndProcedure
retour.s = SendPost()
Debug ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Retour "
Debug retour.s
End
<pre>post<br />Array
(
[testpost1] => 12345
[testpost2] => 54321
)
get<br />Array
(
)
file<br />Array
(
[Nameparameter] => Array
(
[name] => test.xml
[type] =>
[tmp_name] => /mnt/108/sdb/e/e/bmaillard/phpwkQ4Z5
[error] => 0
[size] => 6
)
)
Merci de votre aide
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5
PureBasic 6.11 MacOS
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5
PureBasic 6.11 MacOS