【愚公系列】2023年09月 .NET CORE工具案例-HTTP请求之Flurl


前言

HTTP请求是客户端向服务器发送的请求信息。它包含请求行、请求头部和请求主体三部分。请求行包含请求的方法(GET、POST等),请求的URL和HTTP协议的版本。请求头部包含一些附加的信息,例如请求的主机名、浏览器类型、Cookie等。请求主体则是可选的,用于传输请求的数据。服务器收到HTTP请求后,根据请求信息进行相应的处理并返回响应结果。

一、HTTP请求组件Flurl

1.Flurl简介

Flurl是一个用于HTTP API打包,测试,编写和调试的.NET库。它提供了一系列易于使用且可扩展的方法,可以轻松地发送HTTP请求并解析响应。Flurl可以与任何支持.NET的平台一起使用,例如.NET Core,.NET Framework和Xamarin。它还支持异步操作和流式API,并集成了许多常见的第三方HTTP客户端库,例如HttpClient和RestSharp。Flurl可以帮助开发人员更轻松地管理HTTP API,加快开发速度并提高代码可读性。

Flurl官网:https://flurl.dev/

在这里插入图片描述

2.Flurl的封装

2.1 基本CRUD封装

  1. 首先,确保已安装Flurl.Http包。你可以在项目的NuGet包管理器中搜索并安装Flurl.Http。

  2. 创建一个单独的类来封装你的CRUD请求。例如,可以创建一个名为"CrudService"的类。在该类中,你可以定义各种HTTP请求方法(GET、POST、PUT、DELETE)来执行CRUD操作。

    using Flurl.Http;
    
    public class CrudService
    {
          
          
        private readonly string baseUrl;
    
        public CrudService(string baseUrl)
        {
          
          
            this.baseUrl = baseUrl;
        }
    
        // GET请求
        public async Task<T> Get<T>(string endpoint)
        {
          
          
            var url = $"{
            
            baseUrl}/{
            
            endpoint}";
            var response = await url.GetJsonAsync<T>();
            return response;
        }
    
        // POST请求
        public async Task<T> Post<T>(string endpoint, object data)
        {
          
          
            var url = $"{
            
            baseUrl}/{
            
            endpoint}";
            var response = await url
                .PostJsonAsync(data)
                .ReceiveJson<T>();
            return response;
        }
    
        // PUT请求
        public async Task<T> Put<T>(string endpoint, object data)
        {
          
          
            var url = $"{
            
            baseUrl}/{
            
            endpoint}";
            var response = await url
                .PutJsonAsync(data)
                .ReceiveJson<T>();
            return response;
        }
    
        // DELETE请求
        public async Task Delete(string endpoint)
        {
          
          
            var url = $"{
            
            baseUrl}/{
            
            endpoint}";
            await url.DeleteAsync();
        }
    }
    
  3. 在你的代码中使用这个封装好的CRUD服务。首先创建一个实例化CrudService的对象,并传入API的基本URL。然后,你可以调用相应的方法来执行HTTP请求。

    var baseUrl = "https://api.example.com";
    var crudService = new CrudService(baseUrl);
    
    // 示例使用
    var result = await crudService.Get<SomeObject>("users");
    Console.WriteLine(result);
    
    var newObject = new SomeObject {
          
           Name = "John", Age = 25 };
    var createdObject = await crudService.Post<SomeObject>("users", newObject);
    Console.WriteLine(createdObject);
    
    var updatedObject = new SomeObject {
          
           Id = 1, Name = "Updated John", Age = 30 };
    var updatedResult = await crudService.Put<SomeObject>("users/1", updatedObject);
    Console.WriteLine(updatedResult);
    
    await crudService.Delete("users/1");
    

Flurl还提供了更多强大的功能和选项,你可以参考官方文档深入了解。

2.2 基于JWT授权请求

基于Flurl,使用JWT(JSON Web Token)作为请求头和参数的方法如下:

  1. 导入Flurl和相关的命名空间:
using Flurl;
using Flurl.Http;
  1. 构造JWT请求头:
var jwt = "<your_jwt_token>";
var headers = new {
    
    
    Authorization = $"Bearer {
      
      jwt}"
};
  1. 发送带有请求头的GET请求:
var url = "<api_url>";
var result = await url.WithHeaders(headers).GetAsync();
  1. 发送带有请求头的POST请求:
var url = "<api_url>";
var payload = new {
    
    
    key1 = "value1",
    key2 = "value2"
};
var result = await url.WithHeaders(headers).PostJsonAsync(payload);

在上述代码中,<your_jwt_token>是你的JWT令牌,<api_url>是你想要发送请求的API地址。

2.3 基于Twitter授权请求

以下是一个使用Flurl的完整示例,它将向Twitter API发送请求,获取最近的推文:

using Flurl;
using Flurl.Http;
using Newtonsoft.Json;

public class Tweet
{
    
    
    public string Text {
    
     get; set; }
    public string CreatedAt {
    
     get; set; }
}

public class TwitterApi
{
    
    
    private readonly string baseUrl = "https://api.twitter.com/1.1";

    private readonly string consumerKey;
    private readonly string consumerSecret;
    private readonly string accessToken;
    private readonly string accessTokenSecret;

    public TwitterApi(string consumerKey, string consumerSecret, string accessToken, string accessTokenSecret)
    {
    
    
        this.consumerKey = consumerKey;
        this.consumerSecret = consumerSecret;
        this.accessToken = accessToken;
        this.accessTokenSecret = accessTokenSecret;
    }

    public async Task<IEnumerable<Tweet>> GetRecentTweets(string username, int count)
    {
    
    
        var url = baseUrl.AppendPathSegment("statuses/user_timeline.json")
            .SetQueryParam("screen_name", username)
            .SetQueryParam("count", count);

        var authHeader = CreateAuthHeader("GET", url);

        var responseString = await url.WithHeader("Authorization", authHeader).GetStringAsync();

        return JsonConvert.DeserializeObject<IEnumerable<Tweet>>(responseString);
    }

    private string CreateAuthHeader(string method, string url)
    {
    
    
        var oauth = new Dictionary<string, string>
        {
    
    
            {
    
     "oauth_consumer_key", consumerKey },
            {
    
     "oauth_signature_method", "HMAC-SHA1" },
            {
    
     "oauth_timestamp", ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString() },
            {
    
     "oauth_nonce", Guid.NewGuid().ToString() },
            {
    
     "oauth_token", accessToken },
            {
    
     "oauth_version", "1.0" }
        };

        var sigString = method + "&" + Uri.EscapeDataString(url) + "&" + Uri.EscapeDataString(string.Join("&", oauth.OrderBy(kvp => kvp.Key).Select(kvp => kvp.Key + "=" + kvp.Value)));

        var signKey = Uri.EscapeDataString(consumerSecret) + "&" + Uri.EscapeDataString(accessTokenSecret);

        using (var sha1 = new HMACSHA1(Encoding.UTF8.GetBytes(signKey)))
        {
    
    
            var signatureBytes = sha1.ComputeHash(Encoding.UTF8.GetBytes(sigString));
            var signature = Convert.ToBase64String(signatureBytes);
            oauth.Add("oauth_signature", signature);
        }

        return "OAuth " + string.Join(",", oauth.OrderBy(kvp => kvp.Key).Select(kvp => kvp.Key + "=\"" + Uri.EscapeDataString(kvp.Value) + "\""));
    }
}

在上面的示例中,我们创建了一个名为TwitterApi的类,它包装了Twitter API的一些常见功能。在GetRecentTweets方法中,我们构建了一个URL,设置了查询参数,创建了OAuth认证头部,并使用Flurl发送了GET请求。最后,我们将响应内容反序列化为一个Tweet对象的集合并返回。

要使用此类,您需要先向Twitter申请API密钥和令牌。然后,您可以使用以下代码创建一个TwitterApi对象并调用GetRecentTweets方法:

var api = new TwitterApi("consumer key", "consumer secret", "access token", "access token secret");

var tweets = await api.GetRecentTweets("twitter", 10);

foreach (var tweet in tweets)
{
    
    
    Console.WriteLine(tweet.Text);
}

在这个示例中,我们使用TwitterApi类获取了Twitter帐户名为"twitter"的最近10条推文,并将它们作为文本打印到控制台。

3.案例

3.1 服务端

新建一个webapi框架,定义如下接口:

[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
{
    
    
    [HttpGet]
    public IEnumerable<string> Get()
    {
    
    
        return new string[] {
    
     "公众号名称", "愚公搬代码" };
    }
    //这是一个post请求,Test是一个类,分别包含了Id和name两个字段
    [HttpPost("Posttest")]
    public string Posttest(Test value)
    {
    
    
        return value.Name;
    }
}
public class Test
{
    
    
    public intId {
    
     get; set; }
    public string Name {
    
     get; set; }
}

在这里插入图片描述

3.2 客户端

1、安装包

install-package Flurl;
install-package Flurl.Http;

在这里插入图片描述

using Flurl.Http;


async Task<string> Get()
{
    
    
    string url = "https://localhost:7030/Home";
    var response = await url.GetAsync();
    string result = await response.GetStringAsync();
    return result;
}

async Task<string> Post()
{
    
    
    string url = "https://localhost:7030/Home/Posttest";
    var test = new {
    
     Id = 1, Name = "关注公众号(愚公搬代码)" };
    var response = await url.PostJsonAsync(test);//将对象序列化为json 并传参数
    string result = await response.GetStringAsync();
    return result;
}

var getdata = await Get();
var postdata = await Post();

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/aa2528877987/article/details/132901786