Requete HTML

Résolu/Fermé
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 - 20 avril 2014 à 13:17
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 - 28 avril 2014 à 09:47
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 !!
A voir également:

2 réponses

[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
21 avril 2014 à 18:39
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 jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 1 121
Modifié par Franck7511 le 24/04/2014 à 22:32
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 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 25/04/2014 à 11:42
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 jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 1 121
Modifié par Franck7511 le 25/04/2014 à 12:32
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 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 25/04/2014 à 12:53
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 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
25 avril 2014 à 13:03
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 jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 1 121
25 avril 2014 à 13:38
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