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.
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";
requ-est.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); break;
case XmlNodeType.Text:
Console.WriteLine("Text Node: {0}", reader.Value);
break;
case XmlNodeType.EndElement:
Console.WriteLine("End Element {0}", reader.Name); break;
default:
Console.WriteLine("Other node {0} with value {1}", reader.NodeType, reader.Value); break;
} }