in
La comunità italiana dedicata a Sviluppatori e Architetti IT delle piattaforme Windows

idhttp.post aiuto per capire!!

Ultimo messaggio ricevuto il 08-11-2007 20.58 da Lsk_Gabry. 2 risposta(e).
Pagina 1 di 1 (3 elemento/i)
Ordina messaggi: Precedente Successivo
  • 17-08-2007 23.41

    • cioco
    • Non Valutato
    • Registrato il 17-08-2007
    • Messaggi 1

    idhttp.post aiuto per capire!!

    Salve, ho un problema, vorrei utilizzare il componente indy idhttp per inviare stringhe a form di pagine web, ma per fare ciò vorrei capire alcune cose..

    io ho una pagina web ad esempio la pagina iniziale di google (http://www.google.it), e vorrei scrivere una stringa nell'Edit di ricerca, e poi premere il pulsante di ricerca..

    Ma prima vorrei iniziare solo a scrivere nell'edit di ricerca.

    Usando il componente webbrowser io procedevo così:

    prendevo il nome del componente dalla pagina html in questo caso "q" e tramite questo codice

    WebBrowser1.OleObject.Document.GetElementById('q').Value:='ciao';  spedivo la stringa..

    Ma con IDhttp ho dei problemi, ad esempio con delphi 7 provo a fare così:

    procedure TForm1.Button1Click(Sender: TObject);
    var Parametri: TStringStream;  url : string;
    begin
     url := 'http://www.google.it';
     parametri := tstringstream.Create('');
     parametri.WriteString('q=Ciao');
     idhttp1.post(url,parametri);

    end;

    ma ho il seguente errore: raised exception class EIdHTTPProtocolException with message 'HTTP/1.0 501 Not Implemented', Process stopped....

    Cosa sbaglio?

     

    Grazie in anticipo a quanti risponderanno!

    • Log
  • 08-11-2007 14.59 In risposta a

    Re: idhttp.post aiuto per capire!!

    Ciao cioco,
      scusa il ritardo nella risposta, ma essendomi appena iscrito al sito non potevo anticiparla più di così...

    Premetto che lavoro con una versione del delphi successiva alla tua, e per la precisione la 2007, però l'utilizzo del componente da quel che ne sò (e che vedo dal codice che hai postato) è lo stesso.


    Premetto inoltre che ho utilizzato gran poco il componente webbrowser, però da quel che posso capire dalla riga che hai postato, questa faceva una modifica "live" della pagina (non volendo dire una stupidaggine, dovrebbe essere come quando si utilizza del javascript all'interno di una pagina html, che tramite gli oggetti DOM può modificare lato client il contenuto della pagina stessa...), mentre il componente IdHttp agisce in modo diverso.

    Sfruttando al funzione Post infatti, è come se tu premessi il pulsante "Cerca con google" il quale passa alla funzione di ricerca il contenuto del campo edit della pagina
    Questo però non avviene su una pagina web aperta, ma è come se il tuo software in quel momento diventasse un WebBrowser, tanto che il risultato (la pagina html che conterrà la ricerca di google per esempio) verrà restituito dalla funzione Post come risultato della chiamata alla funzione

    Praticamete bypassi (è corretto?!?!?) il modificare il campo, perchè appunto dai già il "submit" alla pagina, fornendo pure i valori da passare, però o salvi il contenuto del risultato in un file temporaneo in locale e lo visualizzi caricandolo sempre da locale nel componente WebBrowser (dovrebbe essere proprio quello se non erro...), o fai un parsing del testo e puoi visualizzare i risultati della ricerca, per esempio, in una ListBox.

    Detto questo, perchè la tua procedura abbia successo, dovresti quindi fare quanto segue:
    - ricavare come google lancia le ricerche;
    - suddividere questa stringa in URL e parametri;
    - lanciare il metodo post con questi dati;

    io ho provato a cercare al parola "ciao" e la stringa che appare nella barra degli indirizzi è "http://www.google.it/search?hl=it&q=ciao&btnG=Cerca+con+Google&meta=", quindi il tuo codice dovrebbe essere modificato così:

    procedure TForm1.Button1Click(Sender: TObject);
    var
      Parametri: TStrings;  // uso quest'altro modo per elencare i parametri, mi sembra più comodo
                                      // di  uno stream
      url : string;
      risultato: String;

    begin
     url := 'http://www.google.it/search';
     parametri := TStrings.Create;
     parametri.Add('hl=it');
     parametri.Add('q=testo che vuoi cercare');
     parametri.Add('btnG=Cerca+con+Google');
     parametri.Add('meta=');

     risultato := idhttp1.post(url,parametri);

    end;



    Ti sto rispondendo dall'ufficio, senza avere il delphi aperto sotto mano, quindi per il momento non ti assicuro la correttezza di tutto al 100%, però entro sera controllerò ed eventualmente correggerò.

    Sperando d'essere stato d'aiuto, e di non essere arrivato troppo in ritardo, intanto ti saluto.

    Ciao,
      Lsk_Gabry
    ----==== Lsk_Gabry ====----
    -[LosKindividui]-
    WwW.LosKindividui.NeT
    • Log
  • 08-11-2007 20.58 In risposta a

    Re: idhttp.post aiuto per capire!!

    Come immaginavo: dopo aver provato a casa, devo rettificare alcune cose..

    Intanto, visto che google durante le varie ricerche, nella barra degli indirizzi mostra i vari parametri dati alla pagina, significa che non usa il metodo POST (nella barra apparirebbe solo il nome del sito, quindi per questo esempio apparirebbe solo "www.google.it"), ma il metodo GET.

    Il metodo Get del componente IdHTTP, lavora in modo un po diverso dal Post, perchè non prevede il passaggio di parametri in una variabile separata, ma devi indicare tutto nell'URL, quindi la nostra stringa rimarrà la prima che avevo indicato oggi pomeriggio: "http://www.google.it/search?hl=it&q=ciao&btnG=Cerca+con+Google&meta=".

    Io, per fare i test, ho inoltre utilizzato una variante del metodo GET dove specifichi come paratro uno stream dove andrà a memorizzarsi la pagina che ti verrà data come risposta alla tua richiesta; nello specifico ho utilizzato un TStreamFile. (Naturalmente, tu poi utilizzerai la variante che più ti è comoda)

    Ti posto quindi la procedura che lancia una richiesta di ricerca della parola CIAO al motore di Google, e che salva il risultato in un file che avrà come percorso "c:\test.html".

    var
      url : string;
      Fl: TFileStream;
    begin
      // inizializzo la stringa da inviare, comprensiva di indirizzo
      // e parametri
      url := 'http://www.google.it/search?hl=it&q=ciao&btnG=Cerca+con+Google&meta=';

      // inizializzo lo stream su un file
      fl := TFileStream.Create('c:\test.html', fmCreate or fmOpenWrite);

      // lancio la richiesta
      IdHttp1.Get(url, fl);

      // finalizzo lo stream sul file
      fl.Free;
    end;

    Dopo averla lanciata ho disabilitato la scheda di rete della macchina virtuale su cui programmo, simulando quindi che il pc fosse staccato completamente da internet: aprendo il file che mi era stato creato dalla procedura di prima ho visto nel mio browser la pagina con i risultati della ricerca di google.

    A questo punto, rimarrebbe da fare il parsing del file per ricavare per esempio solo le intestazioni delle ricerche, anche la breve descrizione che mette google se interessa, o qualsiasi altra informazione (dimensione pagina; percorso;...).

    Spero con queste rettifiche, d'aver risolto.

    Ciao ciao
    ----==== Lsk_Gabry ====----
    -[LosKindividui]-
    WwW.LosKindividui.NeT
    • Log
Pagina 1 di 1 (3 elemento/i)
Prelevato da http://www.devspy.com/forums/p/4566/5766.aspx
DevSpy.com 6.0 © 2001-2008 - Alcuni Diritti Riservati
Salvo diversa indicazione, tutti i contenuti sono pubblicati sotto licenza "Creative Commons Attribution-Share Alike 3.0"