C#向伺服器發起post和get網路請求
寫在前面
本文前提
- 擁有一臺伺服器並搭建好了站點
- 已經寫好了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不需要
