[RESOLU] Communiquer avec un formulaire HTTP

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Communiquer avec un formulaire

Message par Marc56 »

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)
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Re: Communiquer avec un formulaire

Message par Bmld76 »

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
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

[RESOLU] Communiquer avec un formulaire

Message par Bmld76 »

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.

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
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
_____________________________________________________________
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
Répondre