2010-03-31 20 views
13

ho bisogno di alcuni dati "Post" ad un sito esterno utilizzando HttpWebRequest oggetto dalla mia applicazione (desktop) e ottenere una risposta di nuovo nella mia applicazione attraverso HttpWebResponse oggetto. Ma la pagina web su cui sto postando i dati ha caselle di testo che hanno nomi dinamici.dati pubblicare attraverso httpWebRequest

Come posso ottenere il nome di tali caselle di testo e postare i dati in HttpWebResquest?

Ad esempio, quando carico la pagina il nome della casella di testo è simile a U2FsdGVkX183MTQyNzE0MrhLOmUpqd3eL60xF19RmCwLlSiG5nC1H6wvtBDhjI3uM1krX_B8Fwc ma quando aggiorno il nome della pagina cambia in questo U2FsdGVkX182MjMwNjIzMPAtotst_q9PP9TETomXB453Mq3M3ZY5HQt70ZeyxbRb118Y8GQbgP8.

Grazie per eventuali suggerimenti.

risposta

9

Questi nomi potrebbero essere XPath, ad es. e l'utente come loro:

byte[] data = new ASCIIEncoding().GetBytes("textBoxName1=blabla"); 
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost/myservlet"); 
httpWebRequest.Method = "POST"; 
httpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
httpWebRequest.ContentLength = data.Length; 
Stream myStream = httpWebRequest.GetRequestStream(); 
myStream.Write(data,0,data.Length); 
myStream.Close(); 
30
var request = WebRequest.Create("http://foo"); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
using (var writer = new StreamWriter(request.GetRequestStream())) 
{ 
    writer.Write("field=value"); 
} 
+0

ma non conosco il nome del campo in anticipo. questo è il problema ???? i nomi dei campi non sono codificati, cambiano ogni volta che la pagina si carica o si aggiorna. – user304901

+1

Apri un'altra domanda per questo, poiché è completamente fuori moda in QUESTA domanda (non significa che sia off-topic su SO in generale) – jalgames

2

Sembra che si dovrà ottenere la pagina con un HttpWebRequest e analizzare il contenuto del corrispondente HttpWebResponse per scoprire i nomi delle caselle di testo. Quindi si inviano i valori alla pagina utilizzando un altro HttpWebRequest.

Quindi, fondamentalmente, quello che dovete fare è la seguente:

  1. Emettere un HttpWebRequest con metodo GET per l'URL in cui si trova la pagina con caselle di testo
  2. Ottenere il flusso di risposta del HttpWebResponse
  3. Analizza la pagina contenuta nel flusso di risposta e ottiene i nomi delle caselle di testo. È possibile utilizzare HTML Agility Pack per questo scopo.
  4. Emettere un HttpWebRequest con metodo POST, con tipo di contenuto impostato su "application/x-www-form-urlencoded" e coppie chiave-valore come contenuto.
0

Uso questa funzione per inviare dati. Ma l'url si passa è essere formattato come tale ad esempio

http://example.com/login.php?userid=myid&password=somepassword

Private Function GetHtmlFromUrl(ByVal url As String) As String 

     If url.ToString() = vbNullString Then 
      Throw New ArgumentNullException("url", "Parameter is null or empty") 
     End If 
     Dim html As String = vbNullString 
     Dim request As HttpWebRequest = WebRequest.Create(url) 
     request.ContentType = "Content-Type: application/x-www-form-urlencoded" 
     request.Method = "POST" 


     Try 
      Dim response As HttpWebResponse = request.GetResponse() 
      Dim reader As StreamReader = New StreamReader(response.GetResponseStream()) 
      html = Trim$(reader.ReadToEnd) 
      GetHtmlFromUrl = html 
     Catch ex As WebException 
      GetHtmlFromUrl = ex.Message 
     End Try 

    End Function 
0

prima parte del problema: Forse l'albero HTML è stabile. Quindi puoi trovare la strada per la casella di testo del tuo interrupt con XPath. Usa XmlReader, XDocument e Linq per eseguirlo.