C#向服务器发起post和get网络请求

3 篇文章 0 订阅
2 篇文章 0 订阅

写在前面

本文前提

  1. 拥有一台服务器并搭建好了站点
  2. 已经写好了php连接数据库的代码,懂得基本的php接收网络请求的方法或函数
  3. 会使用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="SELECtFROMadministratorsinfoWHEREaccountNum=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不需要

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值