.NET6用起来-飞书dotnet sdk

932173be9d33c8d5deb5a1b11527ee6b.png

最近有用到飞书开放平台的功能,然后在github上找了下,没找到对应的sdk,于是自己封装了一个飞书dotnet sdk,方便调用,只需要结合官网文档,传递对应的参数,接收到返回的数据。

一、飞书开放平台服务端api约定和实现

api请求约定:

基本信息:{api的url、http method(GET or POST)}

请求头:{访问凭证(token)、http content-type}

路径参数:{放置在url中,以开头}

查询参数:{这部分参数需要在 URL 后使用?进行连接,多个查询参数间以&分隔}

请求体:这部分参数需要放在 HTTP 请求的 Body 中,一般为 JSON 格式

api请求实现:

1.创建一个类库项目(dotnet-feishu)

7a1a98603572f9501bb4bbf44bc7a3ab.png

2.定义个飞书请求的接口(IFeishuRequest),所有的请求都会继承它

public interface IFeishuRequest<out T> where T : BaseResponse
    {
        public  string GetUrl();
        public  string GetHttpMethod();


        /// <summary>
        /// 获取所有的Key-Value形式的文本请求参数字典。
        /// </summary>
        IDictionary<string, object> GetParameters();


        /// <summary>
        /// 获取自定义HTTP请求头参数。
        /// </summary>
        IDictionary<string, string> GetHeaderParameters();
        /// <summary>
        /// 获取路径参数 已:路径参数名称  在url中
        /// </summary>
        /// <returns></returns>
        IDictionary<string, string> GetPathParameters();
    }

再定义一个抽象的请求基类(BaseRequest),实现接口IFeishuRequest部分的方法,如:header、path参数的get和add和httpMethod的set和get。

public abstract class BaseRequest<T> : IFeishuRequest<T> where T : BaseResponse
    {


        private String httpMethod = "POST";
        private IDictionary<string, string> headerParams;
        private IDictionary<string, string> pathParams;
        public string GetHttpMethod() 
{
            return httpMethod;
        }


        public abstract string GetUrl();


        public  IDictionary<string, string> GetHeaderParameters()
        {
            if (this.headerParams == null)
            {
                this.headerParams = new Dictionary<string, string>();
            }
            return this.headerParams;
        }
        public void AddHeaderParameter(string key, string value)
{
            GetHeaderParameters().Add(key, value);
        }
        /// <summary>
        /// 设置请求
        /// </summary>
        /// <param name="httpMethod">默认POST</param>
        public void SetHttpMethod(String httpMethod)
{
            this.httpMethod = httpMethod;
        }


        public IDictionary<string, string> GetPathParameters()
        {
            if (this.pathParams == null)
            {
                this.pathParams = new Dictionary<string, string>();
            }
            return this.pathParams;
        }
        public void AddPathParameter(string key, string value)
{
            GetPathParameters().Add($":{key}", value);
        }




        public abstract IDictionary<string, object> GetParameters();




    }

具体的请求需要实现BaseRequest,来实现获取api的url 和 api的请求参数。以获取访问凭证接口为例:

public class GetTenantAccessTokenRequest : BaseRequest<GetTenantAccessTokenResponse>
    {


        [JsonProperty("app_id")]
        public string AppId { get; set; }


        [JsonProperty("app_secret")]
        public string AppSecret { get; set; }


        public override IDictionary<string, object> GetParameters()
        {
            IDictionary<string, object> keyValues = new Dictionary<string, object>();
            keyValues.Add("app_id", this.AppId);
            keyValues.Add("app_secret", this.AppSecret);
            return keyValues;
        }
        
        public override string GetUrl()
        {
            return $"{FeiShuConstant.BASE_URL}/open-apis/auth/v3/tenant_access_token/internal";
        }
    }

api响应(返回值)约定:

绝大多数 API 的响应体结构包括 code、msg、data 三个部分。

code为错误码,msg为错误信息,data为 API 的调用结果。默认请求成功时,code 为 0,msg 为 success。data 在一些操作类 API 的返回中可能不存在。

api响应实现:

定义一个返回的基类BaseResponse,定义两个属性,如:

public class BaseResponse
    {
        /// <summary>
        /// 返回码
        /// </summary>
        [JsonProperty("code")]
        public int Code { get; set; }
        /// <summary>
        /// 返回消息
        /// </summary>
        [JsonProperty("msg")]
        public string Msg { get; set; }
    }

具体api的返回需要继承BaseResponse,还是以获取访问token为例,如:

public class GetTenantAccessTokenResponse : BaseResponse
    {
        [JsonProperty("tenant_access_token")]
        public string TenantAccessToken { get; set; }


        [JsonProperty("expire")]
        public int Expire { get; set; }
    }

api的请求和响应部分实现已经完成了,如何执行调用飞书api呢?主要利用IHttpClientFactory创建httpclient进行调用,代码如下:

public async Task<T> ExcueAsync<T>(IFeishuRequest<T> req) where T : BaseResponse
        {


            var httpClient = _httpClientFactory.CreateClient();
            var response = new HttpResponseMessage();
            var paras = req.GetParameters();
            var dicHeader = req.GetHeaderParameters();
            var dicPath = req.GetPathParameters();
            httpClient.DefaultRequestHeaders.Clear();
       
            foreach (var kv in dicHeader)
            {
                var value = kv.Key == "Authorization"? "Bearer " + kv.Value : kv.Value;                
                httpClient.DefaultRequestHeaders.Add(kv.Key, value);
            }
            var httpUrl = req.GetUrl();
            if (dicPath.Count()>0) 
            {                 
                httpUrl = httpUrl.Replace($"{dicPath.First().Key}", dicPath.First().Value);
            }
            if (req.GetHttpMethod() == "POST")
            {
                //body json 
                var jsonParas = JsonConvert.SerializeObject(paras);
                StringContent stringContent = new StringContent(jsonParas, Encoding.UTF8, "application/json");


                response = await httpClient.PostAsync(req.GetUrl(), stringContent);
            }
            else
            {
                //querystring KEY=VALUE & KEY=VALUE
                var serverUrl = string.Empty;
                var queryString = HttpClientUtil.GetQueryString(paras);
                if (httpUrl.IndexOf("?") > 0)
                {
                    serverUrl = httpUrl + "&" + queryString;
                }
                else
                {
                    serverUrl = httpUrl + "?" + queryString;
                }
                
                response = await httpClient.GetAsync(serverUrl);
            }


            var content = await response.Content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject<T>(content);
        }

以上是请求、响应代码的封装,以及请求飞书api的代码,下面演示如何使用。

二、dotnet飞书sdk的使用

大致调用流程:new api请求实例并进行赋值,调用IFeishuClient的ExcueAsync方法,返回api结构体。

创建一个单元测试项目(Test-Feishu)如图:

be29d7162da24a0d20ed0e571be72ec2.png

添加TestGetTenantAccessToken方法,测试获取访问凭证api

/// <summary>
        /// 获取token
        /// </summary>
        [Fact]
        public async Task<string> TestGetTenantAccessToken()
        {


            if (!_memoryCache.TryGetValue("token", out string cacheValue))
            {
                //测试获取token
                var req = new GetTenantAccessTokenRequest();
                req.AppId = AppSetting.FeiShuAppId;
                req.AppSecret = AppSetting.FeiShuAppSecret;


                var getTenantAccessTokenResponse = await _feishuClient.ExcueAsync(req);


                cacheValue = getTenantAccessTokenResponse.TenantAccessToken;


                var cacheEntryOptions = new MemoryCacheEntryOptions()
                    .SetSlidingExpiration(TimeSpan.FromSeconds(getTenantAccessTokenResponse.Expire));
                _memoryCache.Set("token", cacheValue, cacheEntryOptions);


                Assert.True(getTenantAccessTokenResponse.Code == 0);


            }


            return cacheValue;


        }

如代码所示,我们访问一个飞书api接口,只需要 new GetTenantAccessTokenRequest(),然后调用IFeishuClient的ExcueAsync方法,返回值就是对应飞书返回的结构体。

04b450955edc19c561c99442018a3221.png

到此,封装的代码已经结束,后面代码会上传到github上。

参考:

飞书开放平台:https://open.feishu.cn/document/ukTMukTMukTM/uITNz4iM1MjLyUzM

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
.NET SDK 6是微软最新发布的一款开发工具软件开发工具包(SDK),用于开发和构建基于.NET的应用程序。它提供了一系列工具和库,帮助开发人员在多个平台上构建高性能、可靠且安全的应用程序。 首先,.NET SDK 6引入了许多新功能和改进,以提升开发效率和开发体验。其中最重要的一个新特性是具有本机和Web开发功能的单个框架,即.NET 6。通过使用.NET 6,开发人员可以使用较少的代码来构建跨平台应用程序,并且可以在运行时自动执行各种优化。 其次,.NET SDK 6提供了一些新的工具,如.NET CLI(Command Line Interface),用于在命令行界面下进行项目管理和构建。它提供了一组命令,以创建、构建、运行和部署.NET应用程序。此外,.NET SDK 6还集成了Visual Studio开发环境,使开发人员可以使用丰富的可视化工具和编辑器进行开发。 此外,.NET SDK 6还引入了一系列新的库和API,用于简化和加速开发过程。例如,它提供了新的HTTP客户端库,用于处理网络请求和响应。还提供了新的JSON API,用于处理JSON数据的序列化和反序列化。此外,.NET SDK 6还提供了针对跨平台开发的Xamarin库和用于构建Web应用程序的Blazor库。 总的来说,.NET SDK 6是一个功能强大且全面的开发工具软件开发工具包,为开发人员提供了许多新的功能和改进。它使开发人员能够更轻松地构建跨平台应用程序,并提供了一套丰富的工具和库,以满足各种开发需求。无论是Web开发、移动应用开发还是桌面应用开发,.NET SDK 6都是一个值得尝试的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值