现在有一个api返回的数据是分页返回,需要分页调用来获取全部数据并保存下来,但是接口的返回json格式比较混乱,新手不太会写,求教。
json返回格式大概类似如下结构:
{
"code": 0,
"msg": "",
"data": {
"0": {
"id": 1,
"state": "2",
"ip": "192.168.0.1",
"date": "2018-04-16 19:37:15"
},
"1": {
"id": 2,
"state": "2",
"ip": "192.168.0.2",
"date": "2018-04-16 19:37:16"
},
"meta": {
"pagination": {
"total": 46,
"per_page": 2,
"current_page": 1,
"total_pages": 23,
"links": {
"next": "/?limit=2&page=1"
}
}
}
}
}
我现在的代码大概思路如下(没法正确运行)
type RespStruct struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data map[string]interface{} `json:"data"`
}
func request(page int, limit int) {
resp := RespStruct{}
api, _ := url.Parse("http://localhost:8080/api/test")
query := api.Query()
query.Set("page", strconv.Itoa(page))
query.Set("limit", strconv.Itoa(limit))
api.RawQuery = query.Encode()
response, err := http.Get(api.String())
if err != nil {
log.Error(err)
return
}
defer response.Body.Close()
body, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Error(err)
return
}
json.Unmarshal([]byte(body), &resp)
if resp.Code != 0 {
return
} else {
for k, v := range resp.Data {
// 以下不知如何写了,伪代码如下
if k == "meta" {
if v["pagination"]["current_page"] >= v[pagination]["total_page"] {
break
} else {
request(page+1, limit)
}
} else {
saveItemInDB(v)
}
}
}
}
在根据分页信息判断是否继续请求的时候 不知道怎么拿分页信息。然后在保存的时候也没法直接去v里面的值。求指点