写在前面
本文前提
- 拥有一台服务器并搭建好了站点
- 已经写好了php连接数据库的代码,懂得基本的php接收网络请求的方法或函数
- 会使用vs2017创建C#winform项目,编写C#代码
Get请求
先分析php代码
下面代码是获取数据库中指定密码账号的用户的的信息
<?php
//新建一个变量用来返回数据
$res = array('error' => false);
//新建一个变量 用来获取网络请求传过来的get参数
$action = "000";
//将网络请求传入过来的参数 赋值给$action变量
if (isset($_GET['action'])) {
$action = $_GET['action'];
}
//新建一个变量 用来获取网络请求传过来的get参数
$ad_account = "000";
//将网络请求传入过来的参数 赋值给$ad_account变量
if (isset($_GET['ad_account'])) {
$ad_account = $_GET['ad_account'];
}
//新建一个变量 用来获取网络请求传过来的get参数
$ad_password = "000";
//将网络请求传入过来的参数 赋值给$ad_password变量
if (isset($_GET['ad_password'])) {
$ad_password = $_GET['ad_password'];
}
//根据传来的账号和密码查询管理员
if($action == "Select_ad"){
if($ad_account!="000" && $ad_password!="000"){
//返回的数据为utf8编码 防止中文乱码现象
$conn->query("set names utf8");
//sql语句 查询所有数据
$sql = "SELECt * FROM `administratorsinfo` WHERE `accountNum`='$ad_account' and `password`='$ad_password'";
$result = $conn->query($sql);
//新建一个数组 接收数据
$users = array();
//遍历查询的结果 一行一行的遍历
while ($row = $result->fetch_assoc()) {
array_push($users, $row);
}
//将数据放在$res变量里面的users部分(如果不存在users部分就会自动新建)
$res['uesrs'] = $users;
//关闭连接
$conn->close();
header("Content-type:application/json");
//以json的格式返回查询到的数据
echo json_encode($res);
}
}
可以从代码看到get接收三个值action,ad_account,ad_password
那么我们就在C# 部分网络请求的字符串上面加上需要传进去的参数
string url = “http://123.57.83.196//admini_text.php?action=Select_ad&ad_account=” + account + “&ad_password=” + password;
同时需要注意的是php里面sql语句的书写
我们写的时候尽量用置入的方式来写 如上面代码的
s
q
l
=
"
S
E
L
E
C
t
∗
F
R
O
M
‘
a
d
m
i
n
i
s
t
r
a
t
o
r
s
i
n
f
o
‘
W
H
E
R
E
‘
a
c
c
o
u
n
t
N
u
m
‘
=
′
sql = "SELECt * FROM `administratorsinfo` WHERE `accountNum`='
sql="SELECt∗FROM‘administratorsinfo‘WHERE‘accountNum‘=′ad_account’ and password
=’$ad_password’";
如果用合并的方法 如下面
$sql = “SELECt * FROM administratorsinfo
WHERE accountNum
=”. $ad_account." and ". “password
=”. $ad_password;
虽然最终结果字符串都一样 但是我当时用到的问题是使用合并的方法的时候当ad_password是中文的时候,无法正确查询到结果,目前不清楚什么原因,而用置入的方法 就没有问题
还可以看到 返回值是json的数据类型C#是不能直接使用的,我们需要转换为JObject 类型(如下面的c#代码)JObject 可以很简单的使用
但是JObject 类型需要用到的引用是Newtonsoft.Json.dll 需要自行下载 可以在下面百度网盘下载600k很快
链接:https://pan.baidu.com/s/1_TUl_xGuAeU0Tc6U57fSDA
提取码:0000
而且需要的命名空间是using Newtonsoft.Json.Linq;记得添加上去
还需要注意的是 php代码中因为查询到的数据是以数组的形式添加到$res变量里面的users部分的所以users应该是一个数组下面的C#解析数据的代码需要注意一下
为了直观的知道php文件响应网络请求返回过来的数据是json类型,我先在浏览器上面发送请求测试一下结果
返回值是下面 很明媚users部分是一个数组 此处指查询到一个数组
分析完php代码以后,我们就可以写C#代码了 如下面
try
{
//网络请求字符串 访问服务器的ad_text.php文件 同时传入三个get的数据action=Select_ad和ad_account和ad_password
string url = "http://服务器IP//ad_text.php?action=Select_ad&ad_account=" + account + "&ad_password=" + password;
HttpClient client = new HttpClient();
//发起网络请求 其中GetAsync方法意味着发起的是get请求
HttpResponseMessage response = client.GetAsync(url).Result;
//获取php文件返回过来的数据 此处返回过来的是json数据类型 我们强行转换为string类型 赋值给myContent
string myContent = response.Content.ReadAsStringAsync().Result;
//将字符串类型的数据转换为 JObject 方便信息的提取
JObject j = JObject.Parse(myContent);
//获取返回过来的数据的users部分中的第一个数组元素中的schoolName部分的值 并转换为string类型
common_example.schoolName = j["uesrs"][0]["schoolName"].ToString();
//获取返回过来的数据的users部分中存在多少个数组 因为users是一个数组
int ad_num = j["uesrs"].ToArray().Count();
Console.WriteLine("管理员相同账号密码有:" + ad_num + "个");
if (ad_num == 1)
{
return true;
}
else
{
return false;
}
}
catch
{
return false;
}
Post请求
同样也先分析php代码
<?php
//新建一个变量用来返回数据
$res = array('error' => false);
//新建一个变量 用来获取网络请求传过来的参数
$action = "000";
//将网络请求传入过来的参数 赋值给$action变量
if (isset($_GET['action'])) {
$action = $_GET['action'];
}
//插入数据 如果传入参数是create
if ($action == "create") {
$schoolName = $_POST['schoolName'];
$accountNum = $_POST['accountNum'];
$password = $_POST['password'];
$teleNum = $_POST['teleNum'];
if($teleNum != null && $accountNum!=null && $password!=null&&$schoolName != null){
$conn->query("set names utf8");
$sql = "INSERT INTO `administratorsinfo`(`teleNum`, `schoolName`, `accountNum`, `password`) VALUES ('$teleNum','$schoolName','$accountNum','$password')";
$result = $conn->query($sql);
if($result){
$conn->close();
echo "插入数据成功";
}
else{
$conn->close();
echo "插入数据失败";
}
}
else{
$conn->close();
echo "信息填写不完整";
}
}
可以知道需要post的数据有四个
$result =
c
o
n
n
−
>
q
u
e
r
y
(
conn->query(
conn−>query(sql);这句话是执行sql语句的意思,除了查询语句返回的是查询的结果,其他增删改返回的是true或者false
这次php响应网络请求的数据类型不是json而是字符串 所以不用转换
于是就可以写下面的C#代码了
try
{
//网络请求字符串 访问服务器的ad_text.php文件 同时传入一个一个get数据action=create
string url = "http://服务器IP//ad_text.php?action=create";
HttpClient client = new HttpClient();
//定义需要post的数据 4个键值对
List<KeyValuePair<String, String>> paraList = new List<KeyValuePair<string, string>>();
paraList.Add(new KeyValuePair<string, string>("schoolName", schoolName));
paraList.Add(new KeyValuePair<string, string>("accountNum", account));
paraList.Add(new KeyValuePair<string, string>("password", password));
paraList.Add(new KeyValuePair<string, string>("teleNum", teleNum));
//发起post请求 将post数据发送过去 PostAsync意味着是post请求
HttpResponseMessage response = client.PostAsync(url, new FormUrlEncodedContent(paraList)).Result;
//获取php文件返回过来的 数据 返回数据的 数据类型由php文件决定 可以返回json或者是string
string myContent = response.Content.ReadAsStringAsync().Result;
if (myContent == "插入数据成功")
{
return true;
}
else
{
return false;
}
}
catch
{
return false;
}
最后可以知道get和post代码都差不多就是post需要传入键值对而get不需要