Статьи

Подключение к внешней базе данных с помощью NuSOAP

Многие мобильные приложения используют внешние базы данных, которые расположены удаленно в Интернете. В следующем руководстве мы создадим простую базу данных, подключимся к ней и получим или отправим данные из этого источника. Для этого мы будем использовать приложение для Windows Phone 7 Silverlight и веб-сервис NuSOAP. Давайте начнем!


Перед тем, как начать, нам нужно установить следующие программы:

Очевидно, нам также понадобится какой-то веб-хостинг, где мы сможем создать базу данных. Нам будет достаточно большинства вариантов бесплатного хостинга, но они могут иметь некоторые ограничения, о которых я расскажу позже в этом уроке.

Нам также нужен FTP-клиент. В этом уроке я буду использовать дополнение FireFTP к Mozilla Firefox. Но вы можете использовать все, что захотите.

Когда все программы установлены, мы можем продолжить.


Для начала убедитесь, что хостинг использует phpMyAdmin, потому что я использую его в примерах. Но если вы решите использовать что-то еще, все команды должны быть похожими.

Сначала нам нужно создать простую базу данных, в нашем случае она будет содержать только одну таблицу и три атрибута:

  • ID — это значение идентифицирует запись. Это должно быть установлено как поле автоинкремента .
  • Имя
  • Фамилия

Имя таблицы — MyUsers .

Для этого просто нажмите «создать таблицу» :

После этого заполните ячейки, как показано на этом скриншоте:

Структура таблицы теперь должна выглядеть так:

На этом этапе мы должны отметить несколько важных моментов:

  • Адрес хоста

Как я писал ранее, у бесплатных хостингов есть ограничения, одним из которых является возможность подключения только с локального хоста , запомните это!

  • Пользователь базы данных

Наше имя пользователя для входа в базу данных:

  • Пароль базы данных
  • Имя базы данных

Запустить наш веб-сервис очень просто:

Во-первых, мы должны скопировать некоторые файлы на FTP-сервер. Я рекомендую ftp-сервер, потому что он напрямую связан с нашим хостингом из-за проблемы с localhost .

После подключения нам нужно скопировать файл nusoap.php, который был загружен ранее. Нам также требуется файл, который будет содержать определенные нами функции, необходимые для нашего приложения; Я назвал это MyService.php .

После того, как мы скопируем файлы, наш корневой каталог FTP должен выглядеть как на картинке ниже:

Теперь откройте файл MyService.php и запишите в него:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<?php
// Pull in the NuSOAP
code require_once(‘nusoap.php’);
// Create the server instance
$server = new soap_server();
// Initialize WSDL support
(MyService is name of our service)
$server——>configureWSDL(‘MyService’, ‘urn:MyService’);
        // Character encoding
        $server->soap_defencoding = ‘utf-8’;
        //————————————————-
        //Registrations of our functions
        //————————————————-
        //Our web service functions will be here.
        //————————————————-
        $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ?
        $server->service($HTTP_RAW_POST_DATA);
?>

Наиболее важные моменты объясняются в верхних комментариях к коду.

Отныне наш сервис должен работать. Мы можем проверить это, набрав в веб-браузере:

http://www.ourdomain.com/MyService.php

Если все прошло хорошо, вы должны увидеть что-то вроде этого:

После того, как мы успешно запустили веб-сервис, мы можем перейти к следующему шагу.


В нашем сервисе нам нужны две функции:

  • Первая функция добавляет данные в онлайн-базу данных.
  • Вторая функция получает данные от него.

Давайте откроем MyService.php . Нам нужно зарегистрировать новую функцию, для этого нужно набрать:

01
02
03
04
05
06
07
08
09
10
$server->register(
    ‘InsertData’, //Name of function
    array(‘FirstName’ => ‘xsd:string’, ‘LastName’ => ‘xsd:string’), //Input Values
    array(‘return’ =>’xsd:boolean’), //Output Values
      ‘urn:MyServicewsdl’, //Namespace
    ‘urn:MyServicewsdl#InsertData’, //SoapAction
    ‘rpc’, //style
    ‘literal’, //can be encoded but it doesn’t work with silverlight
    ‘Some_comments_about_function’
);

Помните, что его нужно поместить перед функцией body и после директив сервера.

Вот некоторые объяснения кода:

1
‘FirstName’ => ‘xsd:string’

«FirstName» — это имя переменной, «string» — это тип переменной (т. Е. Это может быть int, longint, boolean и т. Д.).

Когда функция регистрируется, нам нужно написать ее тело. Ниже приведен код и пояснение:

01
02
03
04
05
06
07
08
09
10
function InsertData($FirstName, $LastName) {
    $connect = mysql_pconnect(«Host»,»UserName»,»UserPassword»));
    if ($connect) {
        if(mysql_select_db(«DatabaseName», $connect)) {
      mysql_query(«INSERT INTO MyUser SET FirstName=’$FirstName’, LastName=’$LastName'»);
            return true;
        }
    }
    return false;
}
1
InsertData($FirstName, $LastName)

Вот название функции и ее атрибуты. Они должны быть такими же, как в разделе регистрации.

1
$connect = mysql_pconnect(«Host»,»UserName»,»UserPassword»);

Здесь мы можем вставить данные, которые мы заметили при создании базы данных.

1
if(mysql_select_db(«DatabaseName», $connect)) {

И здесь тоже.

После этого это простой запрос MySQL, который добавляет данные в нашу базу данных:

1
mysql_query(«INSERT INTO MyUser SET FistName=’$FirstName’, LastName=’$LastName'»);

Теперь пришло время написать вторую функцию. Структура будет похожа на первую.

Вот код регистрации метода:

01
02
03
04
05
06
07
08
09
10
$server->register(
    ‘GetData’,
      array(‘ID’ => ‘xsd:int’),
      array(‘return’ =>’xsd:string’),
    ‘urn:MyServicewsdl’,
    ‘urn:MyServicewsdl#GetData’,
    ‘rpc’,
    ‘literal’,
    ‘Some comments about function 2’
);

Основные отличия заключаются в разделе «Входные / выходные значения» (измененные типы переменных).

Вот код функции тела:

01
02
03
04
05
06
07
08
09
10
11
function GetData($ID) {
  $connect = mysql_pconnect(«Host»,»UserName»,»UserPassword»);
  if ($connect) {
      if(mysql_select_db(«DatabaseName», $connect)) {
      $sql = «SELECT FirstName, LastName FROM MyUser WHERE ID = ‘$ID'»;
          $result = mysql_fetch_array(mysql_query($sql));
          return $result[‘FirstName’].»-«.$result[‘LastName’];
      }
  }
  return false;
}

Вот небольшое объяснение кода:

1
return $result[‘FirstName’].»-«.$result[‘LastName’];

В этой строке указывается, что должно вернуться в приложение Windows Phone.

После написания всех функций файл MyService.php должен выглядеть следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
// Pull in the NuSOAP code
require_once(‘nusoap.php’);
// Create the server instance
$server = new soap_server();
// Initialize WSDL support
configureWSDL(‘MyService’, ‘urn:MyService’);
                // Character encoding
                $server->soap_defencoding = ‘utf-8’;
                //————————————————-
                //Register InsertData function
                $server->register(
                        ‘InsertData’,
                        array(‘FirstName’ => ‘xsd:string’, ‘LastName’ => ‘xsd:string’),
                        array(‘return’ =>’xsd:boolean’),
                          ‘urn:MyServicewsdl’,
                        ‘urn:MyServicewsdl#InsertData’,
                        ‘rpc’,
                        ‘literal’,
                        ‘Some comments about function’
                    );
                //Register GetData function
                $server->register(
                        ‘GetData’,
                        array(‘ID’ => ‘xsd:int’),
                        array(‘return’ =>’xsd:string’),
                          ‘urn:MyServicewsdl’,
                        ‘urn:MyServicewsdl#GetData’,
                        ‘rpc’,
                        ‘literal’,
                        ‘Some comments about function 2’
                    );
                //————————————————-
                //Body InsterData function
                function InsertData($FirstName, $LastName) {
                    $connect = mysql_pconnect(«Host»,»UserName»,»UserPassword»);
                    if ($connect) {
                        if(mysql_select_db(«DatabaseName», $connect)) {
                      mysql_query(«INSERT INTO MyUser SET FirstName=’$FirstName’, LastName=’$LastName'»);
                            return true;
                        }
                    }
                    return false;
                }
 
                //Body GetData function
                function GetData($ID) {
                    $connect = mysql_pconnect(«Host»,»UserName»,»UserPassword»);
                    if ($connect) {
                        if(mysql_select_db(«DatabaseName», $connect)) {
                      $sql = «SELECT FirstName, LastName FROM MyUser WHERE ID = ‘$ID'»;
                            $result = mysql_fetch_array(mysql_query($sql));
                            return $result[‘FirstName’].»-«.$result[‘LastName’];
                        }
                    }
                    return false;
                }
                //————————————————-
                $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ?
                $server->service($HTTP_RAW_POST_DATA);
        ?>

Чтобы проверить функции, мы снова можем набрать http://www.ourdomain.com/MyService.php в браузере. Теперь сайт должен выглядеть немного иначе, но примерно так:

Теперь мы готовы перейти к следующему шагу.


Во-первых, мы должны создать приложение для Windows Phone. Запустим Microsoft Visual Studio для Windows Phone 2010. После запуска Visual Studio нажмите «Файл», затем «Новый проект». Вы должны увидеть диалоговое окно, как на скриншоте ниже:

Наше приложение будет использовать Silverlight, поэтому мы должны проверить этот шаблон. Мы также можем изменить имя проекта, например, локализацию и т. Д. В моем случае имя проекта — «MyApplication». После того, как вы это сделали, нажмите кнопку ОК.

На данный момент мы должны отметить, что нам нужно в нашем приложении. Нам нужно:

  • Два текстовых поля для отправки данных в базу данных (Имя, Фамилия)
  • Одно текстовое поле для получения данных (ID)
  • Две кнопки для подтверждения наших действий

Добавить объекты (например, кнопки) в наше приложение легко, просто перетащите его из «ToolBox» и поместите в предварительный просмотр приложения. Имейте в виду, что у вас есть свобода действий при настройке собственного макета.

Вот как это выглядит в моем приложении:

Другим важным аспектом являются имена элементов, используемых в Visual Studio (они используются позже в коде).

Чтобы изменить его, просто нажмите на элемент. Затем в свойствах вы можете увидеть текст типа «Textbox1», щелкнуть по нему и изменить его на то, что вы можете помнить, что имеет решающее значение. Я использовал эти имена для своих элементов:

  • «FirstNameBox», «LastNameBox» и «IdBox» для текстовых полей
  • «SendBTN» и «ReadBTN» для кнопок

Это все, что нам нужно сделать на этом этапе, мы можем двигаться дальше.


Чтобы подключиться к веб-службе, нужно щелкнуть правой кнопкой мыши «Ссылка» в диалоговом окне «Solution Explorer» и выбрать «Добавить ссылку на службу …»

Вот как это выглядит:

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

В нашем случае адрес будет создан, как на этой схеме: http://www.ourdomain.com/MyService.php?wsdl.

После ввода адреса и нажатия кнопки «Перейти» вы должны увидеть что-то вроде этого:

Если вы видите операции под названием «GetData» и «InsertData», это означает, что соединение было успешно создано! Не забудьте ввести пространство имен, в моем случае это «MyService». Теперь нажмите ОК.


Мы почти в конце этого урока; нам нужно только написать две простые функции.

Первая функция будет за кнопкой «Отправить», поэтому дважды щелкните по ней. Теперь мы должны добавить в начало файла директиву using нашего сервиса:

1
using MyApplication.MyService;

Давайте посмотрим на функцию отправки за кнопкой «Отправить», теперь она пуста:

1
2
3
private void SendBTN_Click(object sender, RoutedEventArgs e)
{
}

Наша полная функция должна выглядеть так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
private void SendBTN_Click(object sender, RoutedEventArgs e)
{
    //Creating new proxy object of our service
    MyServicePortTypeClient send = new MyServicePortTypeClient();
    send.InsertDataCompleted += new EventHandler<InsertDataCompletedEventArgs>(send_InsertDataCompleted);
    //Calling method, as a parameters we type text contained in FirstNameBox and LastNameBox
    //This data will be sent to web service and later to database
    send.InsertDataAsync(FirstNameBox.Text, LastNameBox.Text);
 
}
 
void send_InsertDataCompleted(object sender, InsertDataCompletedEventArgs e)
{
    //If our server return true, that means we’re added data to database…
    if (e.Result)
        MessageBox.Show(«Successfully added!»);
    //…if return false we aren’t.
    else
        MessageBox.Show(«Some problems occured!»);
}

Наиболее важные моменты объясняются в комментариях к коду, но мы должны знать следующее:

Метод send_InsertDataCompleted выполняется, когда мы получаем ответ с сервера. Также эта функция не находится в объекте «SendBTN», она находится снаружи.

Теперь пришло время проверить нашу работу! Начните отлаживать и заполните поля с некоторыми данными. Здесь я ввел Джона как имя и Доу как фамилию, затем я нажал «Отправить»:

Давайте посмотрим, как выглядит база данных:

Да, новая запись с ID = 1 появилась и все идет хорошо.

Теперь мы достигли финальной функции для получения. Это похоже на предыдущий метод. Дважды нажмите на кнопку «Читать» и скопируйте код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
private void ReadBTN_Click(object sender, RoutedEventArgs e)
  {
      //Creating new proxy object of our service
      MyServicePortTypeClient read = new MyServicePortTypeClient();
      read.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(read_GetDataCompleted);
      //Calling method, as a parameters we type text contained in IdTextBox
      //but we must change text type of string to integer (ID in web service have integer type)
      read.GetDataAsync(Convert.ToInt32(IdBox.Text));
  }
 
  void read_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
  {
      MessageBox.Show(e.Result);
  }

Это тот же процесс, что и раньше, «read_GetDataCompleted» выполняется после получения данных из базы данных. В этом методе мы будем использовать окно сообщения, чтобы показать наш результат, то есть имя и фамилию. Есть еще один шаг, который нужно сделать; нам нужно изменить тип текста в IdBox со строки на целое, потому что переменная с именем ID в веб-сервисе имеет целочисленный тип. Для этого я использовал функцию под названием «Convert.ToIn32 ()»


Теперь мы можем видеть, работает ли это. Введите идентификатор в «IdTextBox». Я ввел «1», затем нажал кнопку «Читать».

Все работает! Наше приложение завершено!


В этом руководстве мы создали базу данных с помощью приложения на основе Windows Phone 7 Silverlight и веб-службы NuSOAP. Эта база данных полезна для получения или отправки данных. Внешние базы данных важны, потому что они используются многими мобильными приложениями.