基于 .NET 9 + K8S 写了个 MockHttp
MockHTTP
MockHTTP 可以将现有HTTP,自定义代码去格式化数据转换成GET请求,设置cron定时调用,通知到你的邮箱里。
比如每天早上时自动获取博客园文章列表,天气下雨时通知,各类签到等
更新日志
2024-12-07:
- 增加Diff能力
IEnumerable<string> Diff(this IEnumerable<string> data)
- 对于scheduler定时调度场景,避免相同key的重复提醒
- 优化C2R签名优化
IEnumerable<dynamic> C2R<T>(this IEnumerable<T> mainValues, string[] fieldNames, params IEnumerable[] otherValues)
- 这样生成的对象属性不限制string类型,方便Where 等过滤行为
2024-11-30:
- 支持C2R能力(参考效果:https://wdora.com/mh/req/cnblogs)
- 通常XPath,JToken拿到的是列型数据,需要转换成行对象,通过parseCode需要编写较多繁杂的代码对齐映射
- 借助C2R扩展方法,要配置的parseCode则非常简单:
x=>XPath.Parse(x.Body, "//article//div/a").C2R(["Title", "Link"], XPath.Parse(x.Body, "//article//div/a/@href")).Select(y=>$"<a href='{y.Link}'>{y.Title}</a>").JoinStr("<br/>")
- C2R 方法签名:
IEnumerable<dynamic> C2R<T>(this IEnumerable<T> mainValues, string[] fieldNames, params IEnumerable<string>[] otherValues)
2024-11-27:
- 缩短url(https://wdora.com/mh/req/cnblogs <=> https://www.wdora.com/mockhttp/request/cnblogs)
- ingress 增加 host: wdora.com、path: mh
- api 增加 route: /api/req
- 预热(使用github cicd发布频率高了,导致首次访问较慢)
- 增加hostedService预热编译parseCode
- 增加readinessProbe
2024-11-26:
- Request 支持ParseCode能力(支持调试和默认能力), 可以更加定制化Request的能力
- Request 调整成只使用raw方式返回
- 移除 Scheduler 的ParseCode能力(调度领域无需关注格式化的内容,以及不方便调试未知性等)
POST https://www.wdora.com/mockhttp/request/cnblogs?parseCode=x => string.Join("<br/>", XPath.Parse(x.Body, "//article//div/a"))
GET https://www.cnblogs.com/ HTTP/1.1
Host: www.cnblogs.com
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
这样直接访问API:
https://www.wdora.com/mockhttp/request/cnblogs
也能临时调试你的API(只对本次请求有效,可以通过上面的POST方式更新parseCode 等字段):
https://www.wdora.com/mockhttp/request/cnblogs?parseCode=x => string.Join('\n', XPath.Parse(x.Body, "//article//div/a"))
Request
创建一个请求
可以使用VSCode或VS,创建一个.http文件
POST https://www.wdora.com/mockhttp/request/xxx?parseCode=x => string.Join(';', XPath.Parse(x.Body, "//article//div/a"))
GET https://www.cnblogs.com/ HTTP/1.1
Host: www.cnblogs.com
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
使用请求
返回对象:
GET https://www.wdora.com/mockhttp/request/xxx
响应报文原始格式:
GET https://www.wdora.com/mockhttp/request/xxx?raw=true
定时调度
每天早上9点收到1个邮件,内容为请求返回的对象Body
POST https://www.wdora.com/mockhttp/sched/yyy
Content-Type: application/json
{"cron": "0 9 * * *", "requestName": "xxx", "notifyEmail": "xx@yy.com" }
原始的对象Body 是一个html, 不易读,可以自定义代码格式化(基于.NET 9 BCL, 支持XPath, JToken)
POST https://www.wdora.com/mockhttp/sched/yyy
Content-Type: application/json
{"cron": "0 9 * * *", "requestName": "xxx", "notifyEmail": "xx@yy.com", "parseCode": "x => string.Join(';', XPath.Parse(x.Body, \"//article//div/a\"))" }
- parseCode 会被编译成 Func<Response, object>,返回null,则不通知
- XPath.Parse 是基于 HtmlAgilityPack 二次封装的方法(更方便调用,也支持原有的 HtmlAgilityPack 的方法)
- JToken.Parse 是基于 Newtonsoft.Json 自带的方法
- 你也可以使用.NET 自带的Regex 等能力去定制化返回
- 由于本应用容器化限制了内存,所以你的定制化代码应尽量减少内存占用
会收到一封邮件
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。