У меня есть приложение формы 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), он пуст.
Пожалуйста, помогите мне отобразить и использовать возвращаемую переменную.
P.S. if (responseFromServer= 1), потому что (при успешном запросе) responseFromServer будет строкой, содержащей некоторый JSON. Вы можете отобразить этот JSON в его необработанном формате, но если вы хотите получить от него какой-то смысл, вам сначала нужно десериализовать его. С другой стороны, если вы буквально просто хотите, чтобы ваш PHP возвращал 1 или 0, почему бы не вернуть просто 1 или 0, а не обернуть его в JSON? Это кажется немного бессмысленным. JSON был бы более полезным, если бы вы хотели вернуть несколько значений вместе в массиве или объекте.
@ADyson. Спасибо за совет. Я не программист на полную ставку. Это может быть глупый вопрос, но как еще мне вернуть переменную, если это не JSON. Будет ли приложение C# по-прежнему распознавать и использовать переменную, если я покажу $phpVariable?
«как еще мне вернуть переменную, если это не JSON» ... в любом формате, который вам нравится. JSON, XML, base64, азбука Морзе ... действительно что угодно. Когда вы возвращаете значение, каким бы оно ни было в PHP, оно превращается в обычный текст - это единственный способ, которым ответ HTTP может нести данные (кроме данных двоичного файла). Таким образом, на стороне C# вы всегда будете начинать с простой строки. Затем вы должны знать, что представляет собой строка - поэтому, если вы знаете, что строка будет отформатирована как JSON, вы используете правильный код для десериализации, или, если это XML, вы десериализуете ее с помощью кода чтения XML и т. д.
Итак, я хотел сказать, что если все, что вы собираетесь вернуть, - это одно число, то просто верните это одно число буквально. например if ($SToken= $stmt->fetch(PDO::FETCH_OBJ)){ echo $SToken->cnt); } else { echo 0; } - и это все, что вам нужно. Тогда тело ответа HTTP будет просто состоять из этого числа и ничего больше. Затем, когда вы получаете его на C# в виде строки, вы знаете, что это просто простое число. Вы можете преобразовать его как целое число, если вам нужно, но в противном случае вы можете сразу же отобразить его в окне сообщения.
@ADyson. Спасибо за совет. Я думаю, что я безуспешно передаю переменные из приложения C# Windows Form в веб-службу PHP. См. Мой новый вопрос здесь. Может быть, посоветуете?





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