文章目录
前言
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封装
-
首先,确保已安装Flurl.Http包。你可以在项目的NuGet包管理器中搜索并安装Flurl.Http。
-
创建一个单独的类来封装你的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(); } }
-
在你的代码中使用这个封装好的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)作为请求头和参数的方法如下:
- 导入Flurl和相关的命名空间:
using Flurl;
using Flurl.Http;
- 构造JWT请求头:
var jwt = "<your_jwt_token>";
var headers = new {
Authorization = $"Bearer {
jwt}"
};
- 发送带有请求头的GET请求:
var url = "<api_url>";
var result = await url.WithHeaders(headers).GetAsync();
- 发送带有请求头的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();