Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre expérimenté
    Traduction code JQuery en Lazarus : connection POST à un site
    Bonjour à tous,
    J'ai un script HTML / javascript (jquery) qui fonctionne très bien, voici la fonction en question (elle fonctionne) :
    Code Javascript :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function connect() {	
    	var formData =  '{"user": "username","password": "xxxxxx"}' ;
    	$.ajax({
    		  type: "POST",
    		  url: "http://monsiteweb.com/blablabla",
    		  data: formData,
    		  success: function(txt){  alert( 'REPONSE OK : ' + JSON.stringify(txt)) ;},
    		  error: function(txt){ alert( 'ERR : ' +JSON.stringify(txt));},
    		  dataType: "json",
    		  contentType : "application/json",
    		});
    }


    Ce script passe des données au format json, et récupère un json .

    Je voudrait maintenant reproduire la même chose dans mon programme Lazarus.
    J'ai essayé avec TFPHTTPClient, mais sans succès. Est-ce que quelqu'un a une idée pour traduire le code ci dessus ?
    Je précise que je n'ai pas la main sur le site web en question, mais je sais que le code jquery ci-dessus fonctionne .

    Voici le genre de choses que j'ai essayé, sans succès :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      http := TFPHTTPClient.Create(self);
      http.AllowRedirect := False;
      http.AddHeader('dataType', 'json');
      http.AddHeader('Content-Type', 'application/json');
      memo1.Text := http.FormPost('http://monsiteweb.com/blablabla', '{"user": "username","password": "xxxxxx"}' );
      http.Free;


    Par avance merci!
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  2. #2
    Membre expert
    Salut, pour récupérer tes données en JSon tu dois passer par un object TJSONData/TJSONObject

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    uses
      ..., fpjson, jsonparser
     
    var
      HTTPClient: TFPHTTPClient;
      jData : TJSONData;
      jObject : TJSONObject;
     
    begin
      HTTPClient:=TFPHTTPClient.Create(nil);
      jData := GetJSON(HTTPClient.FormPost('url',''));
      //jObject := TJSONArray(jData);
       ShowMessage(jData.FindPath('[0].user').AsString); // Methode courte si tu est sure de ta structure
    end;


    voir ce petit tuto sur le JSon

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Membre expérimenté
    Merci beaucoup pour ce retour, et de t’intéresser à mon problème !

    En fait, la ligne ci dessous me renvoi une chaine vide :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    http.FormPost('http://monsiteweb.com/blablabla', '{"user": "username","password": "xxxxxx"}' );

    Donc le problème doit être dans la requête (encodage ? content-type ? formatage des paramètres ? )

    En javascript (voir le code posté ci-dessus), les éléments suivants sont importants, car ça ne fonctionne pas sans ces deux lignes :
    Code JAVASCRIPT :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
      dataType: "json",
      contentType : "application/json",


    J'ai essayé de transcrire ça sous Lazarus :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
      http.AddHeader('dataType', 'json');
      http.AddHeader('Content-Type', 'application/json');


    Mais sans succès...
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  4. #4
    Membre expert
    Salut petite question bête mais tu souhaites :
    - Recevoir les données depuis le post en Ajax ?
    - Ou envoyé ton formulaire depuis ton application vers ton site ?

    Si c'est la deuxième essayes :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
       http :=TFPHTTPClient.Create(nil);
       http.AllowRedirect := True;
    Try
     Try
        http.AddHeader('User-Agent','Mozilla/5.0 (compatible; fpweb)');
        http.AddHeader('dataType', 'json');
        http.AddHeader('Content-Type', 'application/json');
        Ret := http.FormPost('http://monsiteweb.com/blablabla', '{"user": "username","password": "xxxxxx"}' );
     Except
        on E: Exception do
        begin
          ShowMessage(E.ClassName + ' : ' + E.Message + ' --> '+Ret);
        end;
     End;
     Finally
       ShowMessage('Reponse = '+Ret);
       FreeAndNil(Http);
     End;


    Autres questions :
    - Quel est ton code PHP qui gère ton Post ? car je vois que dans ton code AJAX pour poster tes données, tu utilises JSON.stringify(txt) quelles sont les valeurs possible de retour dans ta variable "txt" ? c'est une structure JSON aussi ? genre {result:SUCCESS} en cas de succès ?
    - Tu testes sur un serveur local ou distant ? si c'est distant ta connexion doit peut-être nécessiter une connexion SSL (https).

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  5. #5
    Membre expérimenté
    Pour répondre à tes questions :
    - La données récupérée en ajax (en cas de succès) est effectivement au format JSON.
    - Mon code est un formulaire HTML / javascript (jQuery) pur, il n'y a pas de PHP.
    - le site web est distant (et je ne le maitrise pas)

    Pour expliquer (en simplifiant) mon problème : actuellement j'ai un formulaire web statique (HTML / javascript) qui fonctionne bien (et qui réalise toute une série de tâche via des scripts javascript). L'idée serait d'intégrer cette partie dans une application Lazarus existante.

    Je viens de tester ton code, et j'ai une exception :
    EInOutError : Could not initialize OpenSSL library -->
    Donc je pense que tu as vu juste du coté de SSL.
    Dans le formulaire web je n'utilise pas ces notions, c'est probablement le navigateur qui s'en charge.
    Comment intégrer une connexion SSL dans un programme Lazarus ?

    Encore merci pour ton aide !
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  6. #6
    Membre expérimenté
    Grace à tes pistes, j'ai rechercher un peu via notre ami Google et j'ai trouvé une solution qui semble fonctionner (il faut que j'approfondisse).
    J'utilise TidHTTP (indy) et les dll SSL fournie, à la place de TFPHTTPClient, et j'arrive à récupérer mon JSON

    Pour ceux qui tomberont sur ce post et que ça intéresse, un extrait du code que j'utilise et qui fonctionne dans mon cas (il fallait également ajouter l'encodage UTF-8 qui posait problème) :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    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
      HTTP := TIdHTTP.Create;
      try
        try
          RequestBody := TStringStream.Create(UTF8Encode('{"user": "username","password": "xxxxxx"}')) ;
          try
            HTTP.Request.Accept := 'application/json';
            HTTP.Request.ContentType := 'application/json';
            HTTP.Request.CharSet:= 'utf-8';
            ResponseBody := HTTP.Post('http://monsiteweb.com/blablabla', RequestBody);
            jData := GetJSON(  ResponseBody );
            {
    		Traitement du JSON récupéré
    	}
          finally
            RequestBody.Free;
          end;
        except
          on E: EIdHTTPProtocolException do
          begin
            Showmessage(E.Message);
            Showmessage(E.ErrorMessage);
          end;
          on E: Exception do
          begin
            Showmessage(E.Message);
          end;
        end;
      finally
        HTTP.Free;
      end;


    Merci beaucoup pour ton aide!
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  7. #7
    Membre expert
    Salut, de rien
    Je me doutais fortement que c'était a cause de SSL,
    Quelle version de Lazarus utilises tu ?
    Car je sais qu'il y avait un bug avec HTPPClient et SSL dans la version 1.6x ou 1.8x et depuis je ne sais pas si le bug à été résolue...ou pas.
    Et oui, effectivement pour que cela fonctionne il faut installer la bibliothèque OpenSSL sur son environnement.

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  8. #8
    Membre expert
    Citation Envoyé par sat83 Voir le message
    Pour répondre à tes questions :
    - La données récupérée en ajax (en cas de succès) est effectivement au format JSON.
    - Mon code est un formulaire HTML / javascript (jQuery) pur, il n'y a pas de PHP.
    - le site web est distant (et je ne le maitrise pas)

    Pour expliquer (en simplifiant) mon problème : actuellement j'ai un formulaire web statique (HTML / javascript) qui fonctionne bien (et qui réalise toute une série de tâche via des scripts javascript). L'idée serait d'intégrer cette partie dans une application Lazarus existante.

    Juste une petite remarque pour la connexion tu devrais passer par un script PHP car le faire en direct en Javascript, ce n'est sécurisé du tout, suffit juste d'inspecter la page de ton site pour connaitre les logins/mot de passe ou pour "by-passer" la connexion et hop, n'importe qui peux accéder à ton site. Un script PHP en "NO-SQL" est très simple à mettre en place

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP