go代码实现 gin 传入运单号查询运单号物流详情包括快递公司,发货地,物流最后时间及信息,派送员及电话,站点,是否签收,详细物流信息,如果redis缓存中本运单号已签收,则返回快递公司,发货地,物流最后时间及信息,派送员及电话,站点,是否签收,详细物流信息,如果redis缓存中不存在此运单号。调用接口去查询物流详情
时间: 2024-03-29 16:35:46 浏览: 16
好的,以下是一个简单的实现示例:
```go
package main
import (
"encoding/json"
"fmt"
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/go-redis/redis/v8"
)
// 定义运单号物流详情结构体
type Logistics struct {
Company string `json:"company"` // 快递公司
Origin string `json:"origin"` // 发货地
LastTime time.Time `json:"last_time"` // 物流最后时间
Courier string `json:"courier"` // 派送员
CourierTel string `json:"courier_tel"` // 派送员电话
Station string `json:"station"` // 站点
IsSigned bool `json:"is_signed"` // 是否签收
DetailInfo string `json:"detail_info"` // 详细物流信息
}
func main() {
// 初始化 Redis 客户端
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
// 初始化 Gin 引擎
router := gin.Default()
// 定义查询运单号物流详情的接口
router.GET("/logistics/:id", func(c *gin.Context) {
// 获取运单号
id := c.Param("id")
// 先从 Redis 缓存中查询
cacheData, err := rdb.Get(c, id).Result()
if err == nil {
// 如果缓存中已存在,则直接返回缓存数据
var logistics Logistics
json.Unmarshal([]byte(cacheData), &logistics)
c.JSON(http.StatusOK, logistics)
return
}
// 如果缓存中不存在,则调用接口查询物流详情
// 这里假设调用的接口返回的数据结构为 Logistics
logistics := callAPI(id)
// 将查询到的数据保存到 Redis 缓存中
data, _ := json.Marshal(logistics)
rdb.Set(c, id, data, time.Hour*24)
c.JSON(http.StatusOK, logistics)
})
// 启动 Gin 引擎
router.Run()
}
// 模拟调用物流查询接口
func callAPI(id string) Logistics {
// 这里假设调用的接口返回的数据结构为 Logistics
return Logistics{
Company: "顺丰速运",
Origin: "广东深圳",
LastTime: time.Now(),
Courier: "张三",
CourierTel: "13800138000",
Station: "深圳市宝安区福永站",
IsSigned: true,
DetailInfo: "已签收,签收人是李四",
}
}
```
以上代码中,我们定义了一个 `Logistics` 结构体来表示运单号的物流详情信息,使用了 Gin 框架来定义了一个查询接口 `/logistics/:id`,其中 `:id` 表示运单号,我们可以从 URL 中读取该参数。
在查询接口中,我们首先尝试从 Redis 缓存中读取该运单号的物流详情信息,如果缓存中存在,则直接返回缓存数据;否则调用 `callAPI` 函数模拟调用物流查询接口来获取数据,并将查询到的数据保存到 Redis 缓存中,缓存时间为 24 小时。
需要注意的是,我们在 Redis 缓存中保存的是序列化后的 JSON 数据,所以在从缓存中读取数据时,需要将缓存数据反序列化成 `Logistics` 结构体。