zoukankan      html  css  js  c++  java
  • TPL应用:HttpClient

    一、引言

    我们有时侯需要在程序里面调用Http接口、请求http资源、编写http爬虫等的时候都需要在程序里面进行Http请求。很多人习惯的WebClient、HttpWebRequest在TPL下有很多用起来不方便的地方,TPL下推荐使用HttpClient(using System.Net.Http),而且在.NET Core下已经不在支持WebClient等。

    1、发送Get请求

    HttpClient发出Get请求获取文本响应,如下面的代码:

    // 实例化HttpClient对象
    HttpClient hc = new HttpClient();
    // 发送Get请求获取
    string strContent =await hc.GetStringAsync("http://www.baidu.com");

    2、发送Post请求

    HttpClient发送Post请求使用Task<HttpResponseMessage> PostAsync(string requestUri,HttpContent content)方法,方法的第一个参数是请求的地址,第二个参数用来设置请求内容。HttpContent是抽象类,主要有下面的几个子类:

    1. FormUrlEncodedContent:表示用来发送表单格式的请求。
    2. StringContent:表示用来发送字符串请求。
    3. MultipartFormDataContent:Multipart发送表单请求,一般带上传文件信息。
    4. StreamContent:发送流内容。

    二、实例

    下面我们看一个使用HttpClient发送Post请求的实例。我们创建一个MVC项目,控制器里面有三个Post请求的方法,分别模拟三种不同内容的Http请求,代码如下:

    using System.Web;
    using System.Web.Mvc;
    
    namespace HttpClientMVCTestDemo.Controllers
    {
        public class LoginRequest
        {
            public string userName { get; set; }
            public string password { get; set; }
        }
    
    
        public class HttpClientTestController : Controller
        {
            // GET: HttpClientTest
            public ActionResult Index()
            {
                return View();
            }
    
            /// <summary>
            /// 发送表单请求
            /// </summary>
            /// <param name="userName"></param>
            /// <param name="password"></param>
            /// <returns></returns>
            [HttpPost]
            public string Login(string userName, string password)
            {
    
                if (userName == "admin" && password == "123")
                {
                    return "ok";
                }
                else
                {
                    return "error";
                }
            }
    
            /// <summary>
            /// 发送Json格式的请求
            /// </summary>
            /// <param name="data"></param>
            /// <returns></returns>
            [HttpPost]
            public string Login2(LoginRequest data)
            {
                string userName = data.userName;
                string password = data.password;
                if (userName == "admin" && password == "123")
                {
                    return "ok";
                }
                else
                {
                    return "error";
                }
            }
    
            /// <summary>
            /// 上传文件
            /// </summary>
            /// <param name="file"></param>
            /// <returns></returns>
            [HttpPost]
            public string Upload(HttpPostedFileBase file)
            {
                string userName = Request.Headers["UserName"];
                string password = Request.Headers["Password"];
                if (userName == "admin" && password == "123")
                {
                    // 保存文件
                    file.SaveAs(Server.MapPath("~/" + file.FileName));
                    return "ok";
                }
                else
                {
                    return "error";
                }
            }
        }
    }

    然后创建一个Winform程序,用来发送Http请求。界面上有三个按钮,分别发送三种不同内容的Http请求。

    1、发送表单内容的请求

    我们看下面发送表单请求的代码:

    /// <summary>
    /// 模拟发送表单内容的Http请求
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private async void btnForm_Click(object sender, EventArgs e)
    {
        // 实例化对象
        HttpClient client = new HttpClient();
        Dictionary<string, string> dic = new Dictionary<string, string>();
        dic["userName"] = "admin";
        dic["password"] = "123";
        // 参数
        FormUrlEncodedContent content = new FormUrlEncodedContent(dic);
        // 发送post请求
        HttpResponseMessage responseMsg = await client.PostAsync("http://localhost:55179/HttpClientTest/login", content);
        // 返回报文体
        // responseMsg.Content 
        // 返回响应头
        // responseMsg.Headers
        // 返回响应码
        // responseMsg.StatusCode
        // 获取返回值 这里确定返回的是字符串,调用string
        string msg =await responseMsg.Content.ReadAsStringAsync();
        MessageBox.Show($"响应码:{responseMsg.StatusCode.ToString()}");
        MessageBox.Show($"返回内容:{msg}");
    }

    程序运行结果:

    点击“确定”,查看返回内容:

    2、发送json格式内容的请求

    下面是发送json内容请求的代码:

    /// <summary>
    /// 发送json
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private async void btnJson_Click(object sender, EventArgs e)
    {
        // json格式的字符串
        string jsonData = "{userName:'admin',password:'123'}";
        // 实例化对象
        HttpClient client = new HttpClient();
        StringContent content = new StringContent(jsonData);
        // 设置contentType,必须要设置 设置为json格式,MVC会自动转换成Model类型
        content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
        // 发送post请求
        HttpResponseMessage responseMsg = await client.PostAsync("http://localhost:55179/HttpClientTest/login2", content);
        // 获取返回值
        string msg = await responseMsg.Content.ReadAsStringAsync();
        MessageBox.Show($"响应码:{responseMsg.StatusCode.ToString()}");
        MessageBox.Show($"返回内容:{msg}");
    }

    3、上传文件

    看一下上传文件的代码:

    /// <summary>
    /// 上传文件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private async void btnUpload_Click(object sender, EventArgs e)
    {
        // 实例化对象
        HttpClient client = new HttpClient();
        MultipartFormDataContent content = new MultipartFormDataContent();
        content.Headers.Add("UserName", "admin");
        content.Headers.Add("Password", "123");
        using (Stream stream = File.OpenRead(@"F:数据库.txt"))
        {
            content.Add(new StreamContent(stream), "file", "test.txt");
            HttpResponseMessage responseMsg = await client.PostAsync("http://localhost:55179/HttpClientTest/Upload", content);
            // 返回值
            string msg = await responseMsg.Content.ReadAsStringAsync();
            MessageBox.Show($"响应码:{responseMsg.StatusCode.ToString()}");
            MessageBox.Show($"返回内容:{msg}");
        }
    }

    点击上传文件按钮以后,就能在服务器端看到我们上传的文件了。

  • 相关阅读:
    EyeWitness
    中间件解析漏洞
    反思
    【转载】python的logging模块
    RobotFramework中使用Exit For Loop If退出For循环
    python使用ssl的单向认证和双向认证的客户端代码
    使用iptables监测端口流量
    打开GUI面板通过可视化的形式来创建Vue项目
    C#程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。
    递归算法
  • 原文地址:https://www.cnblogs.com/dotnet261010/p/12342296.html
Copyright © 2011-2022 走看看