这是一个简易的Web接口框架,有以下特性:
- 请求和响应纯粹只用JSON格式
- 统一的防回放攻击机制
- 无第三方库依赖
- 速错原则
示例 - 服务端接口:
api := jsonapi.New(crypto.SHA256, jsonapi.StdLogger)
api.HandleFunc("/echo", func(ctx *jsonapi.Context) interface{} {
var req map[string]int
ctx.Request(&req)
return map[string]int{
"value_is": req["value"],
}
})
go http.ListenAndServe(":8080", api)
示例 - 发送请求:
req, err := jsonapi.Get(
"http://localhost:8080/echo",
map[string]int{
"value": 123,
},
)
if err != nil {
t.Fatal(err)
}
var rsp map[string]int
err = req.Do(http.DefaultClient, &rsp)
if err != nil {
t.Fatal(err)
}
if rsp["value_is"] != 123 {
t.Fatal(rsp)
}
示例 - 服务端验证请求:
api := jsonapi.New(crypto.SHA256, jsonapi.StdLogger)
api.HandleFunc("/verify", func(ctx *jsonapi.Context) interface{} {
var req map[string]int
ctx.Request(&req)
ctx.Verify("mykey", 3)
return map[string]int{
"value_is": req["value"],
}
})
go http.ListenAndServe(":8080", api)
示例 - 发送请求并签名:
req, err := jsonapi.Get(
"http://localhost:8080/verify",
map[string]int{
"value": 123,
},
)
if err != nil {
t.Fatal(err)
}
req.Signature(crypto.SHA256, "mykey", jsonapi.Now())
var rsp map[string]int
err = req.Do(http.DefaultClient, &rsp)
if err != nil {
t.Fatal(err)
}
if rsp["value_is"] != 123 {
t.Fatal(rsp)
}
防回放机制支持有效期验证和请求参数签名验证。
这套机制的基本算法是:hash(key + time + path + json)
其中hash算法可以在App实例化时指定;time为客户端通过HTTP头告诉服务端的请求签名时间;path为当前请求的路径;json为请求内容。
客户端通过HTTP头t
告知服务端请求签名时间,这个时间为unix时间(UTC时区);通过HTTP头s
告知服务端请求签名。
服务端通过调用ctx.Verify(key, timeout)
来验证请求有消息,此调用必须在ctx.Request()
调用之后。
传入Verify
方法的key
为空字符串时,框架不验证请求签名。
传入Verify
方法的timeout
为0时,框架不验证请求有效期。
更具体的验证逻辑请阅读Verify
方法的逻辑。