Requete HTML

Résolu
Franck7511 Messages postés 14296 Date d'inscription   Statut Membre Dernière intervention   -  
Franck7511 Messages postés 14296 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai crée un projet en C, et j'ai à un moment besoin d'accéder à une page PHP. (qui doit créditer un compte de x Euros, ce que je réussis à faire sans problème !)
Sur cette page, il y a un "1" si la requête a réussi, et "0" sinon. Pour le moment, j'utilise ShellExecute(), mais la page Internet reste ouverte. Est-il possible de la fermer juste après ? (ou mieux, de récupérer la valeur sur la page ?)

Question subsidiaire : comment faire pour afficher les caractères tels que "é", "à", etc sur la console Windows ?
J'ai essayé system("chcp 850") mais sans succès...

Merci !!

2 réponses

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut Franck7511,

Je pense que tu veux dire "faire une requête http", au lieu de faire une requête "HTML" :-)

Avec libcurl, tu peux le faire sans lancer de navigateur et en récupérant la page.

https://curl.se/libcurl/
https://forums.commentcamarche.net/forum/affich-37594493-codeblocks-installer-une-bibliotheque-librairie
https://curl.se/libcurl/c/
https://curl.se/libcurl/c/libcurl-tutorial.html
https://curl.se/libcurl/c/example.html


Dal
0
Franck7511 Messages postés 14296 Date d'inscription   Statut Membre Dernière intervention   1 121
 
Salut,

J'utilise le framework Qt, mais j'ai du mal à modéliser ce que je veux.

Concrètement, j'ai une page en .php, je lui donne des variables dans le lien du style :
http://(...)/page.php?id=(...)&value=(...) et ça se met à jour dans une base de données.

J'ai fait ça :

QNetworkAccessManager * netManager = new QNetworkAccessManager();
QUrl * remoteserver = new QUrl ("une certaine URL "); // le lien est correct, j'ai vérifié
QNetworkRequest * request = new QNetworkRequest(*remoteserver);
QNetworkReply * reply = netManager->get(*request);


Mais ça ne marche pas comme prévu... Une idée ? Merci !

En fait, je pense que c'est ça que je voudrais : https://curl.se/libcurl/c/simple.html

J'essaie de suite avec libcurl sur mon programme sans GUI pour voir ! :)

Edit :

j'ai fait ça sans succès :

CURL *curl;
          CURLcode res;
          curl = curl_easy_init();
          if(curl)
          {
            curl_easy_setopt(curl, CURLOPT_URL, str); // str contient l'URL, correcte...
            curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
            res = curl_easy_perform(curl);
            if(res != CURLE_OK)
              fprintf(stderr, "curl_easy_perform() failed: %s\n",
                      curl_easy_strerror(res));
            curl_easy_cleanup(curl);
          }


En fait, je récupère bien le contenu de la page (qui doit être 0 en cas d'échec et 1 en cas de succès) grâce à ce code, mais j'ai que des 0, alors que quand je copie colle le contenu de str dans mon navigateur, j'ai que des "1" !!

Peut être str est correcte, mais la fonction ne prend pas en compte le point d'interrogation ou le égal ?
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
curl_easy_perform affecte à ta variable res un code d'erreur, qui renseigne juste sur le fait que requête html s'est bien déroulée, et ce n'est donc pas le contenu de la page (le code est effectivement 0, c'est à dire CURLE_OK, comme indiqué là https://curl.se/libcurl/c/curl_easy_perform.html si tout se passe bien).

Pour récupérer le contenu de la page retournée par la requête Http en mémoire, utilise cette méthode : https://curl.se/libcurl/c/getinmemory.html


Dal
0
Franck7511 Messages postés 14296 Date d'inscription   Statut Membre Dernière intervention   1 121
 
Salut,

En fait, une des fonctions m'imprime le contenu de la page ! (je vois un commentaire mis par l'auteur, et un "0")...

Hier j'ai essayé une ligne de commande

curl -X get "http://(...)/page.php?id=(...)&value=(...)"

Et ça a marché, mais :

curl -X get 'http://(...)/page.php?id=(...)&value=(...)'

ça ne marchait pas ! Du coup, je me demandais si c'était une bonne technique de faire ça :

char url [BUFSIZ] = (...); // contient l'URL
char command [BUFSIZ]; // contient la commande
FILE * fp = NULL;
int return_value;
if(!(freopen("temp.txt","w",stdout)) // on redirige la sortie vers un fichier texte
{
    printf("Erreur lors de la creation d'un fichier temporaire.\n");
    return -1;
}
snprintf(command, (size_t)BUFSIZ, "curl -X get \"%s\"", url);
system(command);
freopen(CON, "w", stdout); // on redirige stdout vers la console
if(!(fp = fopen("temp.txt", "r")))
{
    printf("Erreur de lecture du fichier");
    return -1;
}
// On traite la sortie et on récupère le 0 ou le 1... qu'on met dans return_value...
fclose(fp);
return return_value;


L'inconvénient, c'est que ça me semble un peu compliqué et que ça nécessite d'avoir curl à côté...

Après, je pense vraiment que le problème, c'est que curllib me prend que le premier argument de la page, et s'arrête au premier "&"... J'ai beau vérifier, le lien donné est correct, et copié-collé dans un navigateur, ou passé avec ShellExecute(), j'ai bien un "1"...

Merci de ton aide !!

Juste un petit détail : str contient des espaces et des "&", c'est un problème ?
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Pour l'outil de ligne de commande curl, passer "-X get" est inutile, car la méthode par défaut est déjà GET.

Avec ton freopen, tu vas pouvoir rediriger la sortie de ton programme de stdout vers un fichier. Je ne suis pas sûr que cela affecte la sortie générée par un processus lancé par system. La bonne façon de faire, avec le curl en ligne de commande, puisque tu pars sur l'idée de créer un fichier temporaire avec un appel système au curl en ligne de commande, serait d'utiliser l'option
--output <file>
prévue par la documentation, à cet effet.

Cela dit, c'est lourd et compliqué. Pourquoi n'utilises tu pas un code similaire à l'exemple donné précédemment pour récupérer en mémoire ta page avec libcurl ?

https://curl.se/libcurl/c/getinmemory.html

Cela t'évite un lancement de processus, d'avoir à créer un fichier, l'ouvrir, fermer et d'avoir à gérer son éventuelle suppression aussi.

curlib ne s'arrête pas au premier "&".


Dal
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
c'est lourd et compliqué

c'est aussi peu sûr.. imagine qu'un rigolo s'amuse à remplacer ton exécutable curl par un autre programme avec le même nom.
0
Franck7511 Messages postés 14296 Date d'inscription   Statut Membre Dernière intervention   1 121
 
Faut-il traiter la chaine avant de la passer à libcurl ? (espaces, etc ?)

Si ce n'est pas le cas, j'essaie le snippet proposé et je te dis ce qu'il en est !
0