Добавить

Silverlight и PHP, Взаимодействие (часть 1)


silverlight php json Silverlight и PHP, Взаимодействие (часть 1)

Мой первый пост на этом блоге
Причина написания статьи: как всем известно ASP хостинг достаточно дорогой, а php в разы дешевле. Я расскажу каким образом лучше всего реализовать взаимодействие silverlight приложение с серверной частью на php. Никому не секрет что silverlight дружит с объектами(ну если серьезно то объекты наше все), то есть получение просто текста мало, нужно чтобы php передал нам объект. И тут нам на помощь приходит JSON (JavaScript Object Notation), с ним прекрасно работает как silverlight так и php.
Данный вид решения является не посредственной реализацией модели MVC.

Требования:

1) Для работы у вас должен быть хост с php. У меня на пример установлен локально Apache сервер, на котором настроен php.
2) Ну и само собой у вас должна быть Microsoft Visual Studio с установленным silverlight.

Перейдем сразу к делу:

1) Создадим php файл, в моем случае я его назову index.php. Нужно поставить кодировку Utf8, дальше это будет важно.
В него запишем такой код:


<?php
$json_data = array ('id'=>1,'name'=>"ivan",'country'=>'Russia');
echo json_encode($json_data);
?>

Ответ этого php файла в формате JSON будет выглядеть так:
{“id”:1,”name”:”ivan”,”country”:”Russia”}

2) Теперь чтобы все работало нужно возле нашего index.php создать файл crossdomain.xml, его содержимое ниже.

<?xml version="1.0"?>
<cross-domain-policy>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

Все на этом наша серверная часть готова. Приступаем к разработке silverlight приложения.

3) С начала создадим класс User, при этом он обязательно должен быть public, в нем мы и объявим нужные нам свойства.

public class User
{
public int id { get; set; }
public string name { get; set; }
public string country { get; set; }
}

4) Начинаем редактировать MainPage.xaml. Создадим кнопочку для отправки запроса и текстовое поле, в котором будем отображать ответ.

<Grid x:Name="LayoutRoot" Background="White">
<TextBox Width="200"
	    Height="24"
	    HorizontalAlignment="Left"
	    VerticalAlignment="Top"
	    Margin="10"></TextBox>
<Button Content="Клик"
	   Height="23"
	   HorizontalAlignment="Left"
	   Margin="10,39,0,0"
	   Name="button1"
	   VerticalAlignment="Top"
	   Width="75"
	   Click="button1_Click" />
</Grid>

5) Теперь самая интересная часть, так как мы будем превращать ответ нашего index.php в объект типа User. При нажатии нашей кнопочки приложение будет отправлять запрос.
Событие нажатия кнопки:

private void button1_Click(object sender, RoutedEventArgs e)
{
WebClient wbcl = new WebClient();
wbcl.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wbcl_D);
Uri myUri = new Uri("http://localhost/index.php", UriKind.Absolute);
wbcl.DownloadStringAsync(myUri);
}

6) Добавляем в Referens, System.ServiceModel.Web.dll.

7) Обработка ответа от сервера, и то что мне больше всего нравится это превращение Json в объект, в данном случае User.

void wbcl_D(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show("Error" + e.Error.Message);
return;
}
DataContractJsonSerializer serializer =
new DataContractJsonSerializer(typeof(User));
///Вот и всплыла кодировка UTF8
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(e.Result));
User deserializedUser = new User();
Type tp = deserializedUser.GetType();
DataContractJsonSerializer ser = new DataContractJsonSerializer(tp);
///Превращаем в объект
deserializedUser = (User)ser.ReadObject(ms);
ms.Close();
///Отображаем свойтва объекта
textBox1.Text = deserializedUser.id.ToString() + "  " + deserializedUser.name + "  " + deserializedUser.country;
}

icon cool Silverlight и PHP, Взаимодействие (часть 1) Запускаем и наслаждаемся процессом
Вот пример того что у вас должно получится:


 Silverlight и PHP, Взаимодействие (часть 1)

Что мне в этом способе нравится так это то что в silverlight приложении мы работаем с именно с объектом, который фактически получаем из сервера. Данная модель взаимодействия напоминает MVC, разве что зависит конечно от применения.
В следующей части я раз скажу как можно отправлять данные, получены с silverlight формы.

Полезные ссылки:
Взаимодействие Silverlight приложения с PHP

The Discussion

see what everyone is saying

  • ram2406 Март 5th, 2011 at 20:23 #1

    Мне понравилось))
    Даже в чужеродной среде php есть место родному dotNet’у))

  • Stallion Март 27th, 2011 at 17:11 #2

    Можешь шестой пункт поподробнее описать?

    6) Добавляем в Referens, System.ServiceModel.Web.dll.

  • rio900 Март 29th, 2011 at 14:21 #3

    Эта dll необходима для использования пространства имен System.Runtime.Serialization.Json. А это пространство имен содержит DataContractJsonSerializer, с его помощью делаем объект из Json ответа.

Respond

get in on the action.

* Required

Случайные посты Последние комментарии

  • Alex Says:

    Спасибо за решение, давно искал. Иван, а не могли бы посоветовать как прикрутить к Silverlight Tree...

  • Mikka Says:

    ДОбрый день! у меня может немного ламерский вопрос, но я тоже увлекся этой программой и созданием ра...

  • rio900 Says:

    Эта dll необходима для использования пространства имен System.Runtime.Serialization.Json. А это прос...

  • Clareon Says:

    Спасибо. Очень хороший пример, помогли. Самая суть и ничего лишнего. По книжке не разобрался!...

  • Stallion Says:

    Можешь шестой пункт поподробнее описать? 6) Добавляем в Referens, System.ServiceModel.Web.dll....

  • rio900 Says:

    Лично я делаю так: Создаю ClassLibrary в ней реализую все классы которыми буду обменивстся(В данном ...

  • Clareon Says:

    Вопрос новичка - класс Wepons можно описать в любом месте этого проекта, где это будет сделано грамо...

  • ram2406 Says:

    Мне понравилось)) Даже в чужеродной среде php есть место родному dotNet'у))...

  • Radotvor Says:

    Уже скачал, попробую тоже что-нибудь сделать......

  • rio900 Says:

    Есть бесплатная программка Deep Zoom Composer, это в ней....

Облако меток