看到 https://httpc.dev/ 的用法有一点意思,随便写写。
Build function-based API with minimal code and end-to-end type safety
对比fetch,你需要关注http path、verb,query,但httpc不需要。
TO晔明,自己了解rpc原理。本质上,httpc就是基于http的rpc方式调用。
补一张图。
GET /call/path?$p=[ serialized-parameters ]
测试
POST /call/path
Content-Type: application/json
[ serialized-parameters ]
cli
$ curl -H "Content-Type: application/json" -X POST -d '["22hello", "001"]' http://127.0.0.1:3000/a/a
函数写法
module.exports = function (p1,b){
console.dir(this.path)
console.dir(this.query)
if (this.method === 'POST'){
return "this is a post"
}
return `${p1}+${b}`
}
说明
- this是koa中间件的ctx
- 参数,是调用端决定的
返回json,直接返回object即可
module.exports = function (a, b) {
return {
a: a,
b: b
}
}
npm start
npm test
这是一个demo项目,特性足够了,其他自己改吧
优雅的实现(by晔明)
- 将最简单中间件单独发包
- 支持所有http verbs,使用methods包
- 将文件即路由功能单独发包
- 将koa-compose引入,对鉴权生命周期等提供定制功能
- 改成ts + pnpm + changeset,把fetch client实现一下
- 提供项目cli脚手架等
举例:增加jwt鉴权
确定
app.use(jwt({ secret: 'shared-secret' }));
想想koa-compose
const middleware = compose([ jwt({ secret: 'shared-secret' }) , router ])
将最简单中间件单独发包示例
const httprpc = require('httprpc')
app.fn('com.xxx.yyy', function(a, b){
return a+b
})
app.use(httprpc({
...
}))
app.listen(3000)
client
const client = require('@httprpc/client')('127.0.0.1','3000')
const result = client.call('com.xxx.yy', 'a', 'b')
console.log(result) // ab