2016-12-31 2 views
2

В настоящее время я храню информацию о соединении с C# mysql внутри самого файла класса, который не кажется таким умным, поскольку конечные пользователи могут просто использовать отражатель, например NET Reflector, для отладки исходного кода в дело не обструкционировано.Использование PHP webservice в приложении winforms

Теперь пользователь в stackoverflow рекомендует создать веб-службу, которая будет манипулировать базой данных. Программное обеспечение, которое конечный пользователь будет использовать, затем просто аутентифицируется с помощью веб-службы, используя учетные данные пользователя, а затем использует это для доступа к ресурсам.

Теперь у меня есть следующая проблема: Мой сервер работает на linux ubuntu и уже хранит веб-сайт, созданный с помощью функции plesk.

Я знаю, что я мог бы использовать http://www.mono-project.com/ для размещения веб-сервиса на linux. Но я никогда не делал этого, так как я всегда использовал PHP, чтобы делать такие вещи, и я немного смущен тем, как загрузить веб-сервис C# в установленную моно версию на ssh-сервере.

Могу ли я использовать что-то вроде следующего PHP-кода в качестве веб-службы C# в моем приложении winforms?

код PHP:

<?php 
    class webService extends database 
    { 
     // Web service constructor 
     public function __construct($username, $password, $uniqueId, $versionId) 
     { 
      $this->username = $username; 
      $this->password = $password; 
      $this->salt = 'xxx'; 
      $this->hash = 'xxx'; 
      $this->uniqueId = $uniqueid; 
      $this->versionId = $versionId; 
     } 

     // Web service functions to check database values 

     // Web service user account check function 
     private function userCheck() 
     { 
      $this->connect(); 
      $userCheck = $this->execute_query("SELECT username, password FROM Users WHERE username = '" . $this->username . "' AND password = '" . $this->hash . "'"); 

      if($userCheck && mysqli_num_rows($userCheck) > 0) 
      { 
       return 'true'; 
      } 
      else 
      { 
       return 'false'; 
      } 
     } 

     // Web service unique id check function 
     private function uniqueCheck() 
     { 
      $this->connect(); 
      $uniqueCheck = $this->execute_query("SELECT username, uniqueid FROM Users WHERE username = '" . $this->username . "' AND uniqueid = '" . $this->uniqueId . "'"); 

      if($uniqueCheck && mysqli_num_rows($uniqueCheck) > 0) 
      { 
       return 'true'; 
      } 
      else 
      { 
       return 'false'; 
      } 
     } 

     // Web service first run check function 
     private function firstRunCheck() 
     { 
      $this->connect(); 
      $firstRunCheck = $this->execute_query("SELECT username, firstrun FROM Users WHERE username = '" . $this->username . "' AND firstrun = '0'"); 

      if($firstRunCheck && mysqli_num_rows($firstRunCheck) > 0) 
      { 
       return 'true'; 
      } 
      else 
      { 
       return 'false'; 
      } 
     } 

     // Web service user disabled check function 
     private function disabledUserCheck() 
     { 
      $this->connect(); 
      $disabledUserCheck = $this->execute_query("SELECT disabled FROM Users WHERE username = '" . $this->username . "' AND disabled = '1'"); 

      if($disabledUserCheck && mysqli_num_rows($disabledUserCheck) > 0) 
      { 
       return 'true'; 
      } 
      else 
      { 
       return 'false'; 
      } 
     } 

     // Web service update required check function 
     private function updateRequiredCheck() 
     { 
      $this->connect(); 
      $updateRequiredCheck = $this->execute_query("SELECT requiredupdate FROM requiredupdate WHERE version = '" . $this->versionId . "' AND requiredupdate = 1"); 

      if($updateRequiredCheck && mysqli_num_rows($updateRequiredCheck) > 0) 
      { 
       return 'true'; 
      } 
      else 
      { 
       return 'false'; 
      } 
     } 

     // Web service premium check function 
     private function userPremiumCheck() 
     { 
      $this->connect(); 
      $userPremiumCheck = $this->execute_query("SELECT premium FROM Users WHERE username = '" . $this->username . "' AND premium = 1"); 

      if($userPremiumCheck && mysqli_num_rows($userPremiumCheck) > 0) 
      { 
       return 'true'; 
      } 
      else 
      { 
       return 'false'; 
      } 
     } 

     // Web service functions to update database values 

     // Web service update first run parameters function 
     private function firstRunUpdate() 
     { 
      $firstRunCheck = $this->firstRunCheck(); 

      if($firstRunCheck == 'true') 
      { 
       $this->connect(); 
       $this->execute_query("UPDATE Users SET uniqueid = '" . $this->uniqueId . "', firstrun = '1' WHERE username = '" . $this->username . "'"); 

       return 'true'; 
      } 
      else 
      { 
       return 'false'; 
      } 
     } 

     function to_xml(SimpleXMLElement $object, array $data) 
     { 
      foreach ($data as $key => $value) { 
       if (is_array($value)) { 
        $new_object = $object->addChild($key); 
        to_xml($new_object, $value); 
       } else { 
        $object->addChild($key, $value); 
       } 
      } 
     } 

     // Web service handler function 
     public function webService() 
     { 
      $userCheck = $this->userCheck(); 

      if($userCheck == 'true') 
      { 
       $userArray = array (
        'username' => $this->username, 
        'authentificated' => $this->userCheck(), 
        'firstRun' => $this->firstRunCheck(), 
        'firstRunUpdated' => $this->firstRunUpdate(), 
        'uniqueIdCheck' => $this->uniqueCheck(), 
        'Premium' => $this->userPremiumCheck(), 
        'Disabled' => $this->disabledUserCheck(), 
        'updateRequired' => $this->updateRequiredCheck() 
       ); 
      } 
      else 
      { 
       $userArray = array (
        'username' => $this->username, 
        'userCheck' => $this->userCheck() 
       ); 
      } 

      echo str_replace("\/", "/", json_encode($userArray, JSON_PRETTY_PRINT)); 
     } 
    } 
?> 

Или как является PHP создан Web-сервис, который мог привыкнуть в моем приложении?


Текущий ответ от PHP скрипта будет выглядеть следующим образом:

{ "username": "dane", "authentificated": "true", "firstRun": "false", "firstRunUpdated": "false", "uniqueIdCheck": "true", "Premium": "true", "Disabled": "false", "updateRequired": "false" } 
+0

Если служба может принимать HTTP-запросы и возвращать ответы HTTP, то да, вы можете вызвать ее из приложения winforms. – Crowcoder

ответ

3

Ответ Ромуло М. Фариаса находится на месте.

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

...

Похоже, что вы находитесь на правильном пути с базовой структурой, что вы хотите сделать (MySQL учетные данные и доступ обрабатываются на стороне сервера).

Нет причин, по которым вам нужен какой-либо C#, работающий на вашем сервере, только потому, что ваше клиентское приложение WinForms. Весь смысл веб-сервисов - позволить различным платформам легко разговаривать друг с другом.

Веб-сервис можно рассматривать как веб-сайт, который возвращает данные вместо HTML. (На самом деле все наоборот: веб-сайт или веб-страница - это всего лишь особый вид веб-сервиса, который возвращает html)

Итак, теперь вам нужно только получить приложение WinFroms, чтобы иметь возможность поговорить с кодом PHP, который вы опубликовали выше, через веб-сервис. Другими словами, мы хотим обернуть PHP-код, который у вас есть в веб-службе, а затем получить приложение WinForms для использования веб-службы.

Помните, что для обеспечения безопасности, вы должны убедиться, что вы используете SSL и делать POST, а не GET (т.е. пароль должен быть зашифрован в теле сообщения, не застрял на URL!)

Вот некоторые учебники по созданию PHP веб-сервиса (лучше те, должен существовать): https://davidwalsh.name/web-service-php-mysql-xml-json https://www.codeproject.com/Tips/671437/Creating-Web-Service-Using-PHP-Within-Minutes

Там же много способов, чтобы потреблять веб-сервис из C#. RestSharp, вероятно, идеален.

Обратите внимание, что вы, вероятно, собираетесь выбрать SOAP или JSON в качестве формата. Поэтому ищите учебное пособие по webservice и учебник для потребителей, в котором используется тот же формат. (Создание веб-службы, которая может возвращать разные форматы в зависимости от того, какие запросы клиента являются идеальными, но немного более продвинутыми. У меня нет учебника для этого в PHP)

(В этом контексте «API» является синонимом «веб-сервис», но обратите внимание, что «API» также может иметь совершенно разные значения)

Возможно, вам предстоит пройти долгий путь, но не волнуйтесь, как только у вас есть свой первый пример он будет быстрым и простым в использовании одним и тем же способом, чтобы делать всевозможные отличные вещи.

+0

Вы правы, спасибо, что дали ему лучший ответ! –

1

При использовании API, уровень доступа к данным, становится полностью отделен от клиентского программного обеспечения. Веб-службе просто нужно распечатать ответ определенным образом для понимания клиентами (XML, JSON, YAML и т. Д.).

В вашем приложении C# вы будете называть этот API, а затем преобразовывать ответы на объекты C#. В C# я обычно использую RestSharp. Он прост в использовании и конвертируется из объектов XML или JSON в C#.

На вашем сервере PHP рассмотрите использование некоторых рамок или микро-фреймворков, которые обрабатывают HTTP-коды и ответы. Ответственность сервера за отправку правильного ответа на клиента (тип содержимого ответа, статус и т. Д.). Попробуйте сделать это вручную, иногда бывает скучно. Теперь нет ничего плохого в вашем коде, но вскоре он превратится в маленького монстра.

Для вашего случая Lumen или Silex может быть простым и полезным!

Смежные вопросы