Passant POST i GET paràmetres en windows phone
Un dels problemes principals quan accedim a urls és passar paràmetres amb GET i POST. No és molt complicat, però pots tirar-te uns quants dies buscant informació si tens la mala sort que tinc jo ;).
Primer ja hem treballat amb GET, és la forma "normal" amb que hem treballat en anteriors posts, simplement amb un webclient i esperar l'arxiu de manera asíncrona, per a passar par1, par2... per get els afegirem a la url que obrim:
WebClient wc = new WebClient();
wc.DownloadStringCompleted += HttpCompleted; //funció que es cridarà quan es connecte l'event
wc.DownloadStringAsync(new Uri("http://url?par1=valor1&par2=valor2"));
private void HttpCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
//en e.Result tindrem l'arxiu com a cadena de text
}
}
El problema és que si volem fer-ho per POST o si volem afegir cookies ho haurem de fer d'una altra manera, ho haurem de fer amb webrequest, i necessitarem capturar dos "events", l'inici de la descàrrega i inici de l'stream de dades dades POST, i veurem un allDone que del que parlarem després:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sTuentiURLLogin);
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
request.BeginGetRequestStream(new AsyncCallback(BGRS), request);
private static void BGRS(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
//Final de l'stream de dades post:
Stream postStream = request.EndGetRequestStream(asynchronousResult);
//que volem enviar:
string postData = "par1=valor1&par2=valor2";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
postStream.Write(byteArray, 0, postData.Length);
postStream.Close();
//esperem la resposta asíncronament:
request.BeginGetResponse(new AsyncCallback(BGR), request);
allDone.WaitOne();
}
private static void BGR(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
//en responseeString tindrem el Resultat final
string responseString = streamRead.ReadToEnd();
}
Sí voleu saber com funciona internament, simplement llegiu un poc els comentaris que he posat, tampoc té molta dificutat, el mètode BGRS, envia el POST asíncronament, i l'arreplega asíncronament el mètode BGR. Per últim ens faltaria afeir un:
Private static ManualResetEvent allDone = new ManualResetEvent(false);
per a fer el allDone.WaitOne(), el que fa el mètode és esperar (bloquejar-se) fins que aplega un senyal (descàrrega).
Si vulguerem enviar cookies, seria molt senzill amb un element:
static private CookieContainer CC = new CookieContainer();
en la primera petició, afegirem el codi:
request.CookieContainer = CC;
I així podrem arreplegar les cookies de tornada, si el que vulguerem és enviarla:
Cookie cook = new Cookie("email", "fercavi666@gmail.com", "/", ".gmail.com");
CC.Add(new Uri("http://www.google.com"),cook);
siguent: email la "clau", "fercavi666@gmail.com", el valor, "/" la ruta i ".gmail.com" el domini.
Primer ja hem treballat amb GET, és la forma "normal" amb que hem treballat en anteriors posts, simplement amb un webclient i esperar l'arxiu de manera asíncrona, per a passar par1, par2... per get els afegirem a la url que obrim:
WebClient wc = new WebClient();
wc.DownloadStringCompleted += HttpCompleted; //funció que es cridarà quan es connecte l'event
wc.DownloadStringAsync(new Uri("http://url?par1=valor1&par2=valor2"));
private void HttpCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
//en e.Result tindrem l'arxiu com a cadena de text
}
}
El problema és que si volem fer-ho per POST o si volem afegir cookies ho haurem de fer d'una altra manera, ho haurem de fer amb webrequest, i necessitarem capturar dos "events", l'inici de la descàrrega i inici de l'stream de dades dades POST, i veurem un allDone que del que parlarem després:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sTuentiURLLogin);
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
request.BeginGetRequestStream(new AsyncCallback(BGRS), request);
private static void BGRS(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
//Final de l'stream de dades post:
Stream postStream = request.EndGetRequestStream(asynchronousResult);
//que volem enviar:
string postData = "par1=valor1&par2=valor2";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
postStream.Write(byteArray, 0, postData.Length);
postStream.Close();
//esperem la resposta asíncronament:
request.BeginGetResponse(new AsyncCallback(BGR), request);
allDone.WaitOne();
}
private static void BGR(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
//en responseeString tindrem el Resultat final
string responseString = streamRead.ReadToEnd();
}
Sí voleu saber com funciona internament, simplement llegiu un poc els comentaris que he posat, tampoc té molta dificutat, el mètode BGRS, envia el POST asíncronament, i l'arreplega asíncronament el mètode BGR. Per últim ens faltaria afeir un:
Private static ManualResetEvent allDone = new ManualResetEvent(false);
per a fer el allDone.WaitOne(), el que fa el mètode és esperar (bloquejar-se) fins que aplega un senyal (descàrrega).
Si vulguerem enviar cookies, seria molt senzill amb un element:
static private CookieContainer CC = new CookieContainer();
en la primera petició, afegirem el codi:
request.CookieContainer = CC;
I així podrem arreplegar les cookies de tornada, si el que vulguerem és enviarla:
Cookie cook = new Cookie("email", "fercavi666@gmail.com", "/", ".gmail.com");
CC.Add(new Uri("http://www.google.com"),cook);
siguent: email la "clau", "fercavi666@gmail.com", el valor, "/" la ruta i ".gmail.com" el domini.
Comentaris
Publica un comentari a l'entrada