Как вернуть значение в приложение C# из веб-сервиса php

У меня есть приложение формы Windows C#. Я отправляю три значения (имя пользователя, пароль и токен) в веб-службу PHP для проверки и входа в приложение.

Мой код приложения Windows Form на C#:

 private void btnlogin_Click(object sender, EventArgs e)
{
    if (String.IsNullOrEmpty(txtusername.Text))
    {
        MessageBox.Show("Please insert username");
    }

    if (String.IsNullOrEmpty(txtpassword.Text))
    {
        MessageBox.Show("Please insert password");
    }

    var username = txtusername.Text;
    var password = txtpassword.Text;
    string Token = "28956";
    var SoftwareToken = token;
    WebRequest request = WebRequest.Create("https://mydomain.com.au/Verification.php?username=username&password=password&Token=SoftwareToken");
    request.Method = "GET";
    WebResponse response = request.GetResponse();
    Console.WriteLine(((HttpWebResponse)response).StatusDescription);
    Stream dataStream = response.GetResponseStream();
    // Open the stream using a StreamReader for easy access.  
    StreamReader reader = new StreamReader(dataStream);
    // Read the content.  
    var responseFromServer = reader.ReadToEnd();
    responseFromServer.ToArray();
    /*I have tried:
    responseFromServer.ToArray();(because result on php page is an array.
    I have tried responseFromServer.ToString();*/
    MessageBox.Show(responseFromServer);
}

Мой код веб-службы PHP:

<?php
// Database Structure 
require_once('connect.php');

//Get password from the database for the user
$stmtus = $conn->prepare("SELECT password from `Users` where `email` = :Username");
$stmtus->bindParam(':Username', $username);
$username= $_GET['username'];;
$stmtus -> execute();
$password = $stmtus->fetch();

$un = $_GET['username'];
$pw = $_GET['password'];
$ust = $_GET['Token'];

if (password_verify($pw, $password[0])){
$stmt = $conn->prepare("SELECT 
COUNT(Token) AS cnt FROM `SoftwareToken` 
LEFT JOIN User ON iduser = SoftwareToken.Consultant 
WHERE Token = '$ust' 
AND username = '$un'");
$stmt->bindValue(':Username', $un);
$stmt->bindValue(':Token', $ust);
$stmt->execute();
$result= array();
while($SToken= $stmt->fetch(PDO::FETCH_OBJ)){
array_push($result, $SToken->cnt);  
}
echo json_encode($result);

}

$conn = null;

?>

Похоже, мой код работает. Я пытаюсь отобразить результат на MessageBox.Show() в качестве теста. Конечная цель - использовать возвращаемое значение в операторе if. Возвращаемое значение должно быть массивом из 0 или 1.

Операторы if будут такими:

        if (responseFromServer= 1)
        {
            Form1 identykidzform = new Form1();
            identykidzform.Show();

            Password loginform = new Password();
            loginform.Close();
            reader.Close();
            response.Close();
        }
        else
        {
            Application.Exit();
        }

Когда я звоню на MessageBox.Show(responseFromServer), он пуст.

Пожалуйста, помогите мне отобразить и использовать возвращаемую переменную.

Код PHP ничего не вернет, если пароль не подтвержден. Это не очень хорошо, потому что не говорит вам, в чем проблема. Сначала измените PHP, чтобы он всегда возвращал какой-то ответ, и тогда будет легче увидеть, что происходит.

ADyson 06.12.2018 11:24

P.S. if (responseFromServer= 1), потому что (при успешном запросе) responseFromServer будет строкой, содержащей некоторый JSON. Вы можете отобразить этот JSON в его необработанном формате, но если вы хотите получить от него какой-то смысл, вам сначала нужно десериализовать его. С другой стороны, если вы буквально просто хотите, чтобы ваш PHP возвращал 1 или 0, почему бы не вернуть просто 1 или 0, а не обернуть его в JSON? Это кажется немного бессмысленным. JSON был бы более полезным, если бы вы хотели вернуть несколько значений вместе в массиве или объекте.

ADyson 06.12.2018 11:26

@ADyson. Спасибо за совет. Я не программист на полную ставку. Это может быть глупый вопрос, но как еще мне вернуть переменную, если это не JSON. Будет ли приложение C# по-прежнему распознавать и использовать переменную, если я покажу $phpVariable?

CharlesWashington 06.12.2018 14:10

«как еще мне вернуть переменную, если это не JSON» ... в любом формате, который вам нравится. JSON, XML, base64, азбука Морзе ... действительно что угодно. Когда вы возвращаете значение, каким бы оно ни было в PHP, оно превращается в обычный текст - это единственный способ, которым ответ HTTP может нести данные (кроме данных двоичного файла). Таким образом, на стороне C# вы всегда будете начинать с простой строки. Затем вы должны знать, что представляет собой строка - поэтому, если вы знаете, что строка будет отформатирована как JSON, вы используете правильный код для десериализации, или, если это XML, вы десериализуете ее с помощью кода чтения XML и т. д.

ADyson 06.12.2018 15:29

Итак, я хотел сказать, что если все, что вы собираетесь вернуть, - это одно число, то просто верните это одно число буквально. например if ($SToken= $stmt->fetch(PDO::FETCH_OBJ)){ echo $SToken->cnt); } else { echo 0; } - и это все, что вам нужно. Тогда тело ответа HTTP будет просто состоять из этого числа и ничего больше. Затем, когда вы получаете его на C# в виде строки, вы знаете, что это просто простое число. Вы можете преобразовать его как целое число, если вам нужно, но в противном случае вы можете сразу же отобразить его в окне сообщения.

ADyson 06.12.2018 15:31

@ADyson. Спасибо за совет. Я думаю, что я безуспешно передаю переменные из приложения C# Windows Form в веб-службу PHP. См. Мой новый вопрос здесь. Может быть, посоветуете?

CharlesWashington 07.12.2018 06:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
498
0

Другие вопросы по теме