随着Web站点的内容日益丰富、样式越来越繁多,传统的Webform、MVC这些在服务器端页面上渲染内容的开发方式日渐不可取,既增加服务器负担,也增加带宽需求(现代MVC模式也仅剩下Controller、Model层,View层交由前端)。Web API应运而生,它将单个功能封装成一个API供前端调用,前端只需发起Ajax请求即可向接口请求数据然后渲染页面,无需一次性加载所有内容,大大提升Web站点的运行速度。

ASP.NET Core是跨平台的ASP.NET实现,相比于传统ASP.NET,开发出的API可部署于Linux系统、Docker容器,毕竟Windows Server还是有点小贵。我对比了一下两个版本,发现Core版本具有更简单的API路由实现以及更简单的配置方法(通过中间件实现),对于一个刚开始捣鼓Web API的萌新来说,Core显然更友好,就是Core类库的注释不友好,没中文→_→,不过这点英文还是难不倒把GitHub当中文网站看的我,哼。

第一个.NET Core项目,也是第一个API项目,我就选了自建网易云音乐第三方接口,博客上用的那个被原作者给关闭了,他发博客说是调用量太大了被官方给封禁了。我这个项目是刚刚起步,我也没公开,暂时就给我自己用,等我后期慢慢维护,把代码优化一下、功能给完善了,再自建一个代理IP池(同一IP请求网易云服务器次数太多肯定会被秒封,所以要代理池,这个以后再说),就可以对外公开了。

我觉得我这个项目,很多部分跟爬虫很像,就是披了一个API的外壳。首先从网易云服务器搞数据,我花了好几天研究那个前端加密。大厂就是不一样:连前端post的查询参数都有2层加密,再加上随机生成的一个密钥也被加密。我看了网上很多破解网易云前端加密的文章,把网易云前端那个混淆压缩过的JavaScript文件找出来格式化,然后找到实现加密的那堆代码加上断点运行(全是abcd和数字的js代码看的抓狂),在浏览器控制台观察请求参数,再用C#语言复现加密操作,伪造请求发送,然后拿到数据再解析出我想要的那部分,毕竟官方原始数据太大了,我精简提取出来的是原来的十分之一大小。

数据来源搞定了,然后就是写API控制器,这个项目里我已经全面使用C#的异步编程模型来写,使用async和await关键字来编排任务,把HTTP请求和序列化操作放到后台线程执行,控制器主线程负责接收请求和打包请求数据(生成虚拟HTTP头、Cookie以及加密POST请求表单数据),随后主线程被释放。

JSON解析方面,自然是.NET平台上的网红三方库Newtonsoft.JSON,连微软都放弃.NET自带的序列化库了,在ASP.NET Core Web API里默认使用Newtonsoft.JSON来序列化返回值。利用这个库查找JSON键值的时候,如果要查找的值在数组里,需要使用JArray对象,而不是简单的JObject对象里使用SelectToken()方法。我在这里翻车了,调试的时候说对象引用为空,原来只用JObject是获取不到JSON里的数组的。

最后一步,生成自己的实体对象返回即可,API控制器会自动序列化它再发送给客户端。在此之前我根据官方返回数据建立了自己的实体数据结构,有了JSON数据之后一层层遍历,再创建实体数据对象。

下一步的开发先放一放,我还要跑路去做Vue前端了,暂时不做C#了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据