posts - 5,comments - 1,views - 2634

在c#中常见发送http请求的方式如下

  • HttpWebRequest:

.net 平台原生提供,这是.NET创建者最初开发用于使用HTTP请求的标准类。使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如 timeouts, cookies, headers, protocols。
关于使用HttpWebRequest上传和下载文件,可参考:《c#使用Http上传下载文件》:https://blog.csdn.net/u010476739/article/details/105074171

  • WebClient:

.net 平台原生提供,WebClient是一种更高级别的抽象,是HttpWebRequest为了简化最常见任务而创建的,但也因此缺少了HttpWebRequest的灵活性。

  • HttpClient:

.net 平台原生提供,.net core 推荐使用HttpClient  :https://blog.csdn.net/u010476739/article/details/119782562

 

HttpWebRequest 使用

1.获取token接口

复制代码
 1 private string gettoken()
 2         {
 3             // 测试环境登陆用户
 4             //string username = "as";
 5             //string password = "as";
 6 
 7             string Token = string.Empty;
 8             try
 9             {
10                 if (string.IsNullOrEmpty(username) && username == null && string.IsNullOrEmpty(password) && password == null)
11                     throw new Exception("调用系统接口:获取token失败 用户名或密码不能发为空!");
12                 var strParm = JsonConvert.SerializeObject(new
13                 {
14                     username = username,
15                     password = password
16                 });
17                 //string url = "http接口地址";    // 测试系统地址
18 
19                 Encoding encode = System.Text.Encoding.Default;
20                 Byte[] arrB = encode.GetBytes(strParm);
21                 HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create(url);
22                 Request.Method = "POST";
23                 Request.ContentType = "application/json";  // application/x-www-form-urlencoded
24 
25                 Request.ContentLength = arrB.Length;
26                 //实例化写入请求的参数
27                 using (Stream outStream = Request.GetRequestStream())
28                 {
29                     outStream.Write(arrB, 0, arrB.Length);
30                     outStream.Close();
31                 }
32 
33                 //接受http响应
34                 HttpWebResponse myResponse = Request.GetResponse() as HttpWebResponse;
35                 //读取http返回的数据流
36                 Stream ReceiveStream = myResponse.GetResponseStream();
37 
38                 using (StreamReader reader = new StreamReader(ReceiveStream, Encoding.UTF8))
39                 {
40                     Token = reader.ReadToEnd();
41                     reader.Close();
42                 }
43                 myResponse.Close();
44 
45                 JObject obj = JObject.Parse(Token);
46 
47                 var msg = obj.GetValue("msg").ToString();
48                 if (msg != "操作成功")
49                     throw new Exception(msg);
50 
51                 Token = obj.GetValue("token").ToString();
52             }
53             catch (Exception ex)
54             {
55                 throw ex;
56             }
57             return Token;
58         }
View Code
复制代码

2.获取信息接口+表头token串

复制代码
 1 private string GetbjMerial(JObject infostr)
 2         {
 3             var apiResult = new ResultMessage();
 4             string result = string.Empty;
 5             try
 6             {
 7                 string url = "http接口地址";    // 测试系统地址
 8 
 9                 var para = JsonConvert.SerializeObject(infostr);
10 
11                 Encoding encode = System.Text.Encoding.Default;
12                 Byte[] arrB = encode.GetBytes(para);
13 
14                 //获取token
15                 string token = this.gettoken();
16 
17                 HttpWebRequest Request = HttpWebRequest.Create(url) as HttpWebRequest;
18                 Request.Method = "POST";
19                 Request.ContentType = "text/plain";  //"application/json";
20                 Request.Headers.Add("Authorization", token);
21                 Request.ContentLength = arrB.Length;
22                 //实例化写入请求的参数
23                 using (Stream outStream = Request.GetRequestStream())
24                 {
25                     outStream.Write(arrB, 0, arrB.Length);
26                     outStream.Close();
27                 }
28 
29                 //接受http响应
30                 HttpWebResponse myResponse = Request.GetResponse() as HttpWebResponse;
31                 //读取http返回的数据流
32                 Stream ReceiveStream = myResponse.GetResponseStream();
33 
34                 using (StreamReader reader = new StreamReader(ReceiveStream, Encoding.UTF8))
35                 {
36                     result = reader.ReadToEnd();
37                     reader.Close();
38                 }
39                 myResponse.Close();
40 
41             }
42             catch (Exception ex)
43             {
44                 throw ex;
45             }
46             return result;
47         }
View Code
复制代码

2.1.获取token

 

复制代码
public string gettoken()
{

            string Token = string.Empty;
            try
            {
                //入参
                var par = new { a= db, b = login, password = password };
                var strParm = JsonConvert.SerializeObject(new
                {
                    @params = par
                });
                string url = “”;

                Encoding encode = System.Text.Encoding.Default;
                Byte[] arrB = encode.GetBytes(strParm);
                HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create(url);
                Request.Method = "POST";
                Request.CookieContainer = new System.Net.CookieContainer();
                Request.ContentType = "application/json";  // application/x-www-form-urlencoded

                Request.ContentLength = arrB.Length;
                //实例化写入请求的参数
                using (Stream outStream = Request.GetRequestStream())
                {
                    outStream.Write(arrB, 0, arrB.Length);
                    outStream.Close();
                }

                //接受http响应
                HttpWebResponse myResponse = Request.GetResponse() as HttpWebResponse;
                //读取http返回的数据流
                Stream ReceiveStream = myResponse.GetResponseStream();

                string mes = "";

                using (StreamReader reader = new StreamReader(ReceiveStream, Encoding.UTF8))
                {
                    mes = reader.ReadToEnd();
                    reader.Close();
                }
                myResponse.Close();

                JObject obj = JObject.Parse(mes);
                //dynamic resa = JsonConvert.DeserializeObject(mes);

                if (obj.Property("result") != null)  // 存在结果集
                {
                    JObject res= obj.GetValue("result").ToObject<JObject>();
                    if(res.GetValue("username").ToString() == login && res.GetValue("name").ToString() == login)
                    {
                        // 调用成功,获取token
                        System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)Request.GetResponse();

                        var json = Newtonsoft.Json.JsonConvert.SerializeObject(response.Cookies);

                        if (response.Cookies.Count > 0)
                        {
                            Token = response.Cookies[0].Name + "=" + response.Cookies[0].Value;
                        }
                    }
                }
                if(obj.Property("error") != null)    // 失败
                {
                    JObject res = obj.GetValue("error").ToObject<JObject>();
                    JObject resdata = res.GetValue("data").ToObject<JObject>();

                    throw new Exception("调用接口失败,错误信息:"+ res.GetValue("message").ToString() + " "+ resdata.GetValue("message").ToString());
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }
            return Token;
        }
View Code
复制代码

通过返回接口的cookie中获取session_id作为获取数据接口的request请求的cookie调用接口。

2.2.根据2.1接口返回token结果获取数据

复制代码
public dynamic GetData(string para)
        {
            var apiResult = new ResultMessage();
            dynamic data ;
            try
            {
                string url ="";

                Encoding encode = System.Text.Encoding.Default;
                Byte[] arrB = encode.GetBytes(para);

                //获取token
                string token = this.gettoken();
                HttpWebRequest Request = HttpWebRequest.Create(url) as HttpWebRequest;
                Request.Method = "POST";
                Request.ContentType = "application/json";
                Request.Headers.Add("Cookie", token);
                Request.ContentLength = arrB.Length;
                //实例化写入请求的参数
                using (Stream outStream = Request.GetRequestStream())
                {
                    outStream.Write(arrB, 0, arrB.Length);
                    outStream.Close();
                }

                //接受http响应
                HttpWebResponse myResponse = Request.GetResponse() as HttpWebResponse;
                //读取http返回的数据流
                Stream ReceiveStream = myResponse.GetResponseStream();

                string str = string.Empty;
                using (StreamReader reader = new StreamReader(ReceiveStream, Encoding.UTF8))
                {
                    str = reader.ReadToEnd();
                    reader.Close();
                }
                myResponse.Close();
                
                dynamic res = JsonConvert.DeserializeObject(str);
                dynamic result = JsonConvert.DeserializeObject(Convert.ToString(res.result));

                if(Convert.ToString(result.code) =="200" && Convert.ToString(result.msg) == "操作成功")
                {
                    data = JsonConvert.DeserializeObject(Convert.ToString(result.data));
                }
                else
                {
                    throw new Exception("接口失败,错误代码:" + Convert.ToString(result.code) + ",错误信息:" +Convert.ToString(result.msg));
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }
            return data;
        }
View Code
复制代码

 

 

其他方式可访问:http://t.zoukankan.com/damugua-p-14368067.html

部分内容参考:https://blog.csdn.net/u010476739/article/details/119782562

 

posted on   清风|徐来  阅读(388)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示