HttpRequest Aplikacja Czat Za pomocą obiektu HttpRequest można wykonywać żądania http z aplikacji windows phone. W pierwszej kolejności należy utworzyć aplikację i dodać do niej dwie kontrolki: Buton i TextBlock, tak jak ma to miejsce na obrazku poniżej i nazwać je następująco btest, textblock. Następnie, klikając na button 2-krotnie utworzyć handler kliknięcia. W body metody umieścić kod: private void btest_click(object sender, RoutedEventArgs e) string url = @"http://iisi.pcz.pl/~pnajgebauer/pum/test.php"; try var request = HttpWebRequest.Create(url); var result = (IAsyncResult)request.BeginGetResponse(ResponseCallback, request); catch (WebException exception) MessageBox.Show("Wyjątek"); Metoda rozpocznie wykonywanie żądanie pod adres http://iisi.pcz.pl/~pnajgebauer/pum/test.php Natomiast odpowiedz z serwera przyjdzie asynchronicznie i wywoła metodę ResponseCallback, którą należy dodać do klasy.
private void ResponseCallback(IAsyncResult result) var request = (HttpWebRequest)result.AsyncState; var response = request.endgetresponse(result); using (var stream = response.getresponsestream()) using (var reader = new StreamReader(stream)) var contents = reader.readtoend(); Dispatcher.BeginInvoke(() => textblock.text = contents; ); Po wywołaniu metody uzyskiwany jest dostęp do strumienia z zawartością zwróconą z serwera www. Następnie zawartość jest umieszczana w kontrolce textblock. Niemożliwe jest bezpośrednie odwołanie do kontrolki textblock ponieważ działają one na różnych wątkach dlatego trzeba skorzystać z Dispatcher.BeginInvoke. Przesyłanie Parametrów. Metoda GET przekazuje parametry po znaku? jako pary nazwa=wartość w adresie URL żądanie oddzielając je znakiem & między kolejnymi parametrami. Metoda POST przesyła parametry w ciele żądania. W naszym wypadku również muszą być enkodowane jak w GET. Dodajemy kolejny buton bposttest w raz z jego handlerem.
private void bposttest_click(object sender, RoutedEventArgs e) string url = @"http://iisi.pcz.pl/~pnajgebauer/pum/posttest.php"; try var request = HttpWebRequest.Create(url); request.contenttype = "application/x-www-form-urlencoded"; request.method = "POST"; request.begingetrequeststream(new AsyncCallback(RequestStreamCallback), request); catch (WebException exception) MessageBox.Show("Wyjątek"); W tym przypadku asynchronicznie jest oczekiwanie na utworzenie strumienia danych do wysłania na serwer. Gdy strumień jest gotowy wywoływany jest handler RequestStreamCallback, w którym zostaną przesłane nasze parametry na serwer. private void RequestStreamCallback(IAsyncResult asynchronousresult) HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; // End the operation Stream poststream = request.endgetrequeststream(asynchronousresult); string arg1 = "Argument1+-?&&"; string arg2 = "Argument2"; // Convert the string into a byte array. string data = HttpUtility.UrlEncode("arg1") + '=' + HttpUtility.UrlEncode(arg1) + '&' + HttpUtility.UrlEncode("arg2") + '=' + HttpUtility.UrlEncode(arg2); byte[] bytearray = Encoding.UTF8.GetBytes(data); // Write to the request stream. poststream.write(bytearray, 0, bytearray.length); poststream.close(); // Start the asynchronous operation to get the response request.begingetresponse(new AsyncCallback(ResponseCallback), request); nasze argumenty zanim zostaną przesłane muszą zostać encodowane tak aby pozbyć się znaków specjalnych ( +,?, =, & itp ), a następnie zamienione na formę binarną. Do encodowania parametrów służy metoda HttpUtility.UrlEncode.
Zadanie 1. Wykonać aplikację imitującą czat, która: Będzie pobierać wiadomości z strony http://iisi.pcz.pl/~pnajgebauer/pum/data.xml, sprasuje listę wiadomości i odpowiednio wyświetli w kontrolce. Format pliku. <?xml version="1.0" standalone="yes"?> <messages> <message user="usertest" date="28/04 11:47:11">TextTest</message> <message user="pat" date="28/04 12:28:28">Wiadomość</message> </messages> Serwer przechowuje jedynie 10 ostatnich wiadomości. Ponadto, nazwa użytkownika user jest obcinana do 10 znaków, a wiadomość message do 40 znaków. Do prasowania XML-a można użyć obiektu XmlReader poniżej przykładowy fragment. var reader = XmlReader.Create(new StringReader(data)); while (reader.read()) switch (reader.nodetype) case XmlNodeType.Element: Console.WriteLine("Start Element 0", reader.name); case XmlNodeType.Text: Console.WriteLine("Text Node: 0", reader.value); case XmlNodeType.EndElement: Console.WriteLine("End Element 0", reader.name); default: Console.WriteLine("Other node 0 with value 1", reader.nodetype, reader.value); Zadanie 2. Do aplikacji dodać funkcje dodawania nowego wpisu. Pod adresem http://iisi.pcz.pl/~pnajgebauer/pum/add.php znajduje się skrypt dodający kolejne wpisy czatu. Przyjmuje przesłane metodą POST parametry: user nazwa użytkownika (obcina powyżej 10 znaków), message wiadomość (obcina powyżej 40 znaków). Server zwraca:
ok jeśli wpis został dodany. no params jeśli brakuje parametrów. Pozostałe oznaczają niepowodzenie.