使用GO代码实现 go gin 订单号查询物流详情,然后将已签收的订单号缓存到redis缓存
时间: 2024-04-02 18:36:36 浏览: 146
好的,我可以给您提供一个简单的实现示例供参考,具体代码如下:
```go
package main
import (
"encoding/json"
"fmt"
"net/http"
"github.com/gin-gonic/gin"
"github.com/go-redis/redis"
)
type Order struct {
ID string `json:"id"`
Status string `json:"status"`
DetailURL string `json:"detail_url"`
}
var redisClient *redis.Client
func init() {
redisClient = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
}
func main() {
r := gin.Default()
r.GET("/orders/:id", getOrder)
r.Run(":8080")
}
func getOrder(c *gin.Context) {
orderID := c.Param("id")
// check if order is in redis cache
cacheResult, err := redisClient.Get(orderID).Result()
if err == nil {
var order Order
err := json.Unmarshal([]byte(cacheResult), &order)
if err != nil {
fmt.Println("error unmarshalling order from cache: ", err)
} else {
c.JSON(http.StatusOK, order)
return
}
}
// make request to third-party logistics API
resp, err := http.Get(fmt.Sprintf("https://logisticsapi.com/orders/%s", orderID))
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "error making request to logistics API"})
return
}
defer resp.Body.Close()
if resp.StatusCode == http.StatusNotFound {
c.JSON(http.StatusNotFound, gin.H{"error": "order not found"})
return
}
if resp.StatusCode != http.StatusOK {
c.JSON(http.StatusInternalServerError, gin.H{"error": "error fetching order details from logistics API"})
return
}
var order Order
err = json.NewDecoder(resp.Body).Decode(&order)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "error parsing order details"})
return
}
// cache order in redis if it has been delivered
if order.Status == "Delivered" {
orderJSON, _ := json.Marshal(order)
err = redisClient.Set(orderID, string(orderJSON), 0).Err()
if err != nil {
fmt.Println("error caching order in redis: ", err)
}
}
c.JSON(http.StatusOK, order)
}
```
在上面的代码中,我们使用了Gin框架来实现了一个简单的API接口,接收订单号作为参数,然后从缓存或第三方物流API中获取订单详情信息,最后将结果返回给客户端。
在 `init()` 函数中,我们初始化了一个Redis客户端实例,用于连接Redis数据库。
在 `getOrder()` 函数中,我们首先检查订单是否已经存在于Redis缓存中,如果存在则直接从缓存中获取订单信息并返回给客户端;否则我们将会向第三方物流API发起请求,获取最新的订单详情信息,并根据订单状态将其缓存到Redis中。
需要注意的是,为了保证缓存的一致性,我们需要及时更新Redis缓存中的订单信息,可以在订单状态变更时触发更新操作。
希望对您有所帮助。
阅读全文