Transmettre des données Access via HTTP
A partir d’Access, je souhaiterais remplir un formulaire Web via le protocole HTTP. Comment faire ?
Scénario
Dans cet article, on part d’un scénario simple, pour poser les bases. Je dispose :
- D’un serveur HTTP de test Apache, avec quelques bouts de code en PHP. En pratique, il s’agit d’un serveur WAMP installé sur une machine de test (WAMP = Windows, Apache, MySQL et PHP, plus quelques outils supplémentaires).
- Les serveurs Apache et MySQL sont supposés en cours d’exécution.
- Sur ce serveur, un dossier
access_tests
. Sur une installation standard de WAMP, ce dossier est physiquement situé dansC:wampwwwaccess_tests
. Son adresse HTTP est par conséquent :http://SERVEUR/access_tests
, oùSERVEUR
est soit le nom du serveur, soit son adresse IP. - Dans le dossier, un formulaire HTML a été créé. La page qui contient ce formulaire s’appelle
formulaire.html
. - Le formulaire est lui-même transmis à une page de traitement appelée
resultat.php
.
Le formulaire HTML
La construction du formulaire n’est pas le sujet de cet article. Voici simplement à quoi ressemble le formulaire :
Les champs, de haut en bas, s’appellent (attribut name
de la balise <input>
, en HTML) :
nom
prenom
email
Ce sont ces noms de champs qui vont servir à la transmission de données.
Le formulaire HTML a pour méthode POST
, et pour action resultat.php
(la page qui traitera les résultats).
La page de traitement de résultats
La page de traitement des résultats s’appelle donc resultat.php
. Voici le code simplifié de cette page (le code gagnerait à être amélioré et sécurisé, mais nous irons à l’essentiel pour la démo, puisque l’exemple tourne sur un serveur fermé).
1 2 3 4 5 6 7 |
<?php header('Content-Type: text/html; charset=UTF-8'); echo 'NOM = ' . $_POST['nom'] . "n"; echo 'PRENOM = ' . $_POST['prenom'] . "n"; echo 'EMAIL = ' . $_POST['email'] . "n"; ?> |
Si vous êtes habitué à PHP, vous voyez que ce code affiche les champs nom
, prenom
et email
transmis par la méthode POST
. J’ai supposé que ces champs étaient vraiment transmis (qu’il n’en manque pas lors de la transmission). On pourra ajouter des vérifications plus fines plus tard.
A ce stade, si vous remplissez le formulaire et cliquez sur le bouton Envoyer, le formulaire est transmis à la page de traitement, et les résultats bruts sont affichés dans le navigateur.
Envoi des données à partir d’Access
Maintenant que tout est en place et que l’enchaînement formulaire / traitement a pu être testé, nous souhaitons transférer les mêmes données à partir d’Access. En d’autres termes : le formulaire HTML ne sert plus, c’est Access qui va transmettre directement les résultats à la page resultat.php
. De retour à votre base de données Access :
- Démarrez Visual Basic Editor (touches
ALT
+F11
). - Commencez par établir une référence à Microsoft XML, dans le menu Outils / Références (si vous avez plusieurs bibliothèques de même nom, prenez la plus récente).
- Cliquez sur le menu Insertion / Module, puis recopiez dans le module le code suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
' --- ' REMPLISSAGE DE FORMULAIRE VIA HTTP ' --- Sub RemplissageFormulaire() Dim strURL As String Dim strParams As String Dim http As MsXML2.ServerXMLHTTP ' URL du flux à lire strURL = "http://192.168.1.8/access_tests/resultat.php" strParams = "nom=Inisan&prenom=Hervé&email=webmaster@self-access.com" ' Objet XMLHTTP Set http = New MsXML2.ServerXMLHTTP ' Ouverture de l'URL http.Open "POST", strURL, False ' En-tête de la requête http.setRequestHeader "Content-encoding", "UTF-8" http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" http.setRequestHeader "Content-Length", Str(Len(strParams)) ' Envoi http.Send strParams ' En cas de réussite, le code renvoyé est 200 If (http.Status = 200) Then ' Afficher la réponse du serveur ' dans la fenêtre Exécution Debug.Print "REPONSE HTTP : " Debug.Print http.responseText Else Debug.Print "ERREUR : " & http.Status & " - " & http.statusText End If ' On libère les objets Set http = Nothing End Sub |
Quelques explications
- Le code repose principalement sur l’objet
ServerXMLHTTP
déjà abordé dans la série Lecture de flux RSS. D’où la référence faite plus haut, et la variablehttp
. - La variable
strURL
contient l’adresse de la page PHP de traitement (encore une fois : le formulaire HTML ne joue plus aucun rôle ici, on transmet directement les résultats à la page finale). - La chaîne
strParams
contient la liste des valeurs à transmettre (celles qui au départ étaient renseignée dans le formulaire HTML). Les valeurs sont écrites sous la forme «champ1=valeur1&champ2=valeur2
« . Les noms de champs doivent respecter ceux traités par la page PHP (nom
,prenom
etemail
). - L’adresse est ensuite ouverte par l’instruction
http.Open
. - Quelques paramètres sont ensuite définis pour préciser le type de demande : encodage des caractères, type de contenu et taille des données (il s’agit de la taille de la chaîne de paramètres). Dans un exemple simple, le code devrait fonctionner même si ces paramètres sont manquants.
- Une fois la communication paramétrée, on peut envoyer les paramètres via la commande
http.Send
. - Les résultats sont cette fois affichés dans Access, et plus dans le navigateur. Le serveur répond par un statut de 200 si tout s’est bien passé, auquel cas on peut afficher sa réponse (
http.responseText)
. Dans le cas contraire, on affiche les valeurs d’erreur.
Il y a bien d’autres améliorations à prévoir par la suite, mais vous avez déjà les principes pour tester !