|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2008
Città: Milano; 9 Vendite concluse -> Wilde; emmepi; Homerj81; cos1950; mariotanza; Benia; grigor; alekia; ARG0
Messaggi: 11160
|
[VB. NET] Lettura pagina web
Ciao a tutti
Sto realizzando un'applicazione metro con visual basic .net. Devo recuperare delle informazioni da alcune pagine web dinamiche (php) e la maniera più semplice mi è sembrata quella di scaricare il sorgente e di metterlo in una stringa e successivamente farne il parsing. Ho trovato in internet molti script che usano Webrequest e WebResponse ma sono vecchi e non vanno più bene. Venendo al dunque, come posso recuperare il testo della pagina e metterlo in una stringa? Grazie EDIT: Sono incappato nel problema opposto e non riesco a venirne a capo. Devo inviare tramite POST due valori ad una pagina PHP. Nella pagina ci sono due campi. Uno che ha name=login e uno che ha name=password. Io devo inviare i dati di login in modo da effettuare l'accesso a quella pagina. Il problema non mi sembra complesso ma il mio codice non va. E' questo qui: Codice:
Dim Address As String = Address.Text
Dim data As Dictionary(Of [String], [String]) = New Dictionary(Of String, String)()
data("username") = Field.Text
data("password") = Field2.Text
Dim content As HttpContent = New FormUrlEncodedContent(data)
Dim response As HttpResponseMessage = Await rootPage.httpClient.PostAsync(Address, content)
Ultima modifica di birmarco : 07-11-2012 alle 19:04. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2008
Città: Milano; 9 Vendite concluse -> Wilde; emmepi; Homerj81; cos1950; mariotanza; Benia; grigor; alekia; ARG0
Messaggi: 11160
|
nessuno? :-)
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Non mi pare molto complesso:
Dim response As HttpResponseMessage = Await rootPage.httpClient.GetAsync(resourceAddress) Dim responseBodyAsText As String responseBodyAsText = Await response.Content.ReadAsStringAsync() una volta istanziato HttpClient chiamo il metodo GetAsync e utilizzando le nuove estensioni per la programmazione asincrona automaticamente ti ritrovi con la variabile valorizzata. Niente di tremendamente complesso. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Mar 2008
Città: Milano; 9 Vendite concluse -> Wilde; emmepi; Homerj81; cos1950; mariotanza; Benia; grigor; alekia; ARG0
Messaggi: 11160
|
Grazie mille della risposta
Purtroppo per me programmazione asincrona & co sono cose nuove, per cui non riesco a capirci molto Ho inserito il tuo codice nella mia funzione, ma ho dovuto modificarlo leggermente perchè mi dava degli errori Ora è così: Codice:
Public Async Function getPage(URL As String) As Task
Dim Client As New System.Net.Http.HttpClient
Dim response As HttpResponseMessage = Await Client.GetAsync(URL)
Dim responseBody As String
responseBody = Await response.Content.ReadAsStringAsync()
End Function
Però ora ho un problema PS. Cmq sì, effettivamente non è così complesso a guardarlo, anzi sembra abbastanza semplice. Il problema è che non sapevo da dove partire Ultima modifica di birmarco : 30-10-2012 alle 18:55. |
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Per il codice io avevo solo copiato dall'esempio Microsoft Quote:
Codice:
Friend Shared Async Function DisplayTextResult(response As HttpResponseMessage, output As TextBox) As Task
Dim responseBodyAsText As String
output.Text &= response.StatusCode & " " & response.ReasonPhrase & Environment.NewLine
responseBodyAsText = Await response.Content.ReadAsStringAsync()
responseBodyAsText = responseBodyAsText.Replace("<br>", Environment.NewLine)
' Insert new lines
output.Text &= responseBodyAsText
End Function
|
||
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2008
Città: Milano; 9 Vendite concluse -> Wilde; emmepi; Homerj81; cos1950; mariotanza; Benia; grigor; alekia; ARG0
Messaggi: 11160
|
Quote:
Sarà un po' dura ma almeno imparo qualcosa in più, non mi piace imparare qualcosa facendo solo esercizi fine a se stessi Cmq non è proprio uno dei miei primi lavori di programmaziome, con VB il primo veramente serio... se viene qualcosa Ma output.text non è l'output su console? Farò una Metro App su console Cmq in attesa di trovare una soluzione, ho pensato di inviare il risultato ad altre funzioni, direttamente dal corpo della funzione task. Che sono le funzioni che gestiscono quell'output e lo piazzano al posto giusto. COsì evito a monte il problema. Anche perchè mi pare che concettualmente sia giusto così o sbaglio? Cioè la programmazione async non prevede che vengano eseguite delle elaborazioni scollegate dalla continuità dell'elaborazione principale? Quindi aspettarsi un output da una funzione così sarebbe assurdo perchè appunto non si sa quando arriva. Quindi anche tutti i miei tentativi darebbero errore, se il risultato non è ancora arrivato, o sbaglio? Mantenendo tutto nel flusso async dovrei evitare ogni tipo di problema. Però penso che mi tocchi cmq gestire delle eccezioni, perchè se eseguo un comando che richiede che quell'output della procedura asincrona sia completato, e invece non è completato, avrei dei brutti problemi Dovrei quindi mettermi a capire bene come funziona la classe Task, così da poter bloccare alcune operazioni prima che il Task async sia completato. Correggimi se sto sbagliando Di per sè mi sembra intelligente questa programmazione asincrona però in certi casi come il mio mi sembra una sofisticazione inutile, sarebbe stato più comodo avere anche il vecchio metodo, che anche se era bloccante nel mio caso sarebbe stato uguale... |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
output è di tipo TextBox. L'hai almeno guardato l'esempio della Microsoft? Domanda cosmica: perchè usi quella sola di VB??? |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Mar 2008
Città: Milano; 9 Vendite concluse -> Wilde; emmepi; Homerj81; cos1950; mariotanza; Benia; grigor; alekia; ARG0
Messaggi: 11160
|
Quote:
VB lo uso perchè mi piace - HTML5 e Javascript - C# - VB .Net Usare HTML e Javascript non mi ispirava, per un programma desktop, C# non mi piace moltissimo, di VB conosco qualcosa per cui mi sono orientato su questo VB mi piace perchè ha una sintassi pulita, del C# odio tutte le graffe e una sintassi che non è proprio chiarissima nella lettura. CIoè è vero che è come Java ecc ma se posso scegliere preferisco VB. Poi non sono cmq ad un livello elevatissimo quindi sono praticamente uguali, per quello che devo fare io. Ma perchè dici che fa schifo? Il linguaggio me l'ero studiato anni fa... anzi a dirla tutta avevo studiato il VB non .Net! Il .Net è arrivato dopo e ho cercato di integrare, per il tempo che avevo. Poi è da tantissimo che non lo uso, e nel frattempo ho usato altri linguaggi come Java e PHP. Da allora sono cambiate molte cose... e avendo ripreso l'altro giorno mi ci vorrà un po' per tornare in auge La teoria di molte cose ce l'ho, a volte in altri linguaggi... il problema è capire come farlo in VB e punto fondamentale non conosco quasi nessuna delle principali librerie di VB |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Mar 2008
Città: Milano; 9 Vendite concluse -> Wilde; emmepi; Homerj81; cos1950; mariotanza; Benia; grigor; alekia; ARG0
Messaggi: 11160
|
Alla fine sono giunto ad una soluzione.
Sto costruendo una classe Pagina che oltre agli altri metodi che mi servono ha queta funzione di recupero della pagina. Il risultato di questa procedura lo piazzo in una variabile privata della classe. Usando await so quando finisce e procedo. |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Mar 2008
Città: Milano; 9 Vendite concluse -> Wilde; emmepi; Homerj81; cos1950; mariotanza; Benia; grigor; alekia; ARG0
Messaggi: 11160
|
Sono incappato nel problema opposto e non riesco a venirne a capo. Devo inviare tramite POST due valori ad una pagina PHP.
Nella pagina ci sono due campi. Uno che ha name=login e uno che ha name=password. Io devo inviare i dati di login in modo da effettuare l'accesso a quella pagina. Il problema non mi sembra complesso ma il mio codice non va. E' questo qui: Codice:
Dim Address As String = Address.Text
Dim data As Dictionary(Of [String], [String]) = New Dictionary(Of String, String)()
data("username") = Field.Text
data("password") = Field2.Text
Dim content As HttpContent = New FormUrlEncodedContent(data)
Dim response As HttpResponseMessage = Await rootPage.httpClient.PostAsync(Address, content)
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Mar 2008
Città: Milano; 9 Vendite concluse -> Wilde; emmepi; Homerj81; cos1950; mariotanza; Benia; grigor; alekia; ARG0
Messaggi: 11160
|
UP UP UP
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Mar 2008
Città: Milano; 9 Vendite concluse -> Wilde; emmepi; Homerj81; cos1950; mariotanza; Benia; grigor; alekia; ARG0
Messaggi: 11160
|
Quote:
I cookie non dovrebbero essere necessari, nella pagina ho una spunta "ricordami" che non è obbligatoria e che attiva il salvataggio dei cookie, ma io non invio quel dato e di default non ricorda nulla. Dovrebbe quindi aprire una sessione PHP. Ma quindi il mio codice è giusto e potrebbe essere una problematica di questo tipo? Oppure è tutto cannato? |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:49.




















