从 C# Windows 窗体调用 PHP Web 服务

Posted

技术标签:

【中文标题】从 C# Windows 窗体调用 PHP Web 服务【英文标题】:Calling PHP Web -Service from C# Windows Form 【发布时间】:2019-05-07 01:14:07 【问题描述】:

我正在尝试将 C# Windows 窗体的用户名、密码和软件令牌号验证为 mysql 数据库中的值。

我的 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 代码(Web 服务):

<?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;

?>

我正在努力了解如何从 C# 应用程序调用 Web 服务,如何将变量从 C# 应用程序传递到 Web 服务,以及如何将 json_encode 从 Web 服务返回到 C# 应用程序。

我不是全职程序员,这是我第一次接触 Web 服务。如果对如何改进这两个代码有任何建议,我将不胜感激。

更新

我已根据协助更新了我的代码。当我使用变量运行 php 代码时,它会运行并给我一个 $result (数组)。一个数字答案 1。

当我测试我的代码以在 MessageBox 中显示结果时,MessageBox 是空的。为什么?

【问题讨论】:

" 如果对如何改进任何一个代码有任何建议," 看来您已经在使用正确的 php 库来处理密码,我想编写并使用准备好的语句来防止SQL注入..然后我注意到SQL代码中的WHERE Token = '$ust' AND username = '$un'");仍然容易发生SQL注入,您应该使用WHERE Token = :Token AND username = :Username);来参数化它 @RaymondNijland 感谢您的建议。我认为我没有成功地将变量从 C# Windows 窗体应用程序传递到 PHP Web 服务。请参阅我的新问题here。也许你有什么建议? 【参考方案1】:

当然,您可以从 C# 调用 WebService。 System中有一个内置的类。

一种方式:

WebRequest request = WebRequest.Create("http://localhost:8080/?username=john");
request.Method="GET";
WebResponse response = request.GetResponse();

其他方式:

HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:8080/");
HttpResponseMessage response = await client.PostAsJsonAsync( "api/user", userName);
response.EnsureSuccessStatusCode();

【讨论】:

非常感谢。我喜欢第一种方法。要在 C# 应用程序中使用结果,是否使用 if(response = 1) #dosomething 请标记要回答的问题。谢谢:) 我做到了。如何在我的 c# 中使用响应?当我执行if(response = 1) #dosomething 时,出现错误“无法将 int 类型转换为 webresponse” 请我们铸造 if( (int)response = 1) #dosomething if( (int)response = 1) #dosomething 不工作。相同的错误:无法将 int 类型隐式转换为 System.Net.WebResponse【参考方案2】:

我使用的代码:

    var username = txtusername.Text;
    var password = txtpassword.Text;
    string Token = "28956";
        var url = "https://mydomain.com.au/LoginVerification.php?";
        var var = "username=" + username + "&password=" + password + "&Token=" + Token ;
        var URL = url + var;
        //MessageBox.Show(URL);


        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        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();
        //MessageBox.Show(responseFromServer);
        // Display the content.  
        if (responseFromServer == "\n  Allow")
        
            MessageBox.Show("Success");           
        

【讨论】:

以上是关于从 C# Windows 窗体调用 PHP Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何从 .aspx 页面 javascript 调用 C# 方法后面的 Web 窗体代码

你如何在 Windows 窗体上显示动画 GIF (c#)

如何使用 c# 从 Windows 窗体向用户显示默认的 Windows 身份验证提示?

从 C# 中的外部 DLL 访问 windows 窗体控件

C# - 从线程更新 windows 窗体元素

c#中是wpf好用还是窗体好用