使用Golang开发Discord Bot调用Riot API获取指定字段报错求助
在Golang中调用Riot Games API提取指定字段(id和召唤师等级)
我用Golang开发Discord Bot,调用Riot Games API时想仅获取返回数据里的id和召唤师等级(API返回格式类似{"id":"", "name":"", "summonerLevel":0 ...}),但当前代码只是输出整个响应字符串,无法提取目标字段,求解决方法。
当前实现代码:
req, err := http.NewRequest("GET", "https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/"+a, nil) if err != nil { panic(err) } req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36") req.Header.Add("Accept-Language", "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,ja-JP;q=0.6,ja;q=0.5") req.Header.Add("Origin", "https://developer.riotgames.com") req.Header.Add("X-Riot-Token", "RGAPI-195db001-c13f-4412-a9ee-bda6e13baa48") client := &http.Client{} resp, err := client.Do(req) if err != nil { panic(err) } defer resp.Body.Close() bytes, _ := ioutil.ReadAll(resp.Body) str := string(bytes) fmt.Println(str) return str
解决步骤
- 定义目标结构体:只声明需要的字段,注意Riot API中召唤师等级的字段名是
summonerLevel,不是你提到的level。 - 解析JSON响应:用
encoding/json包将响应体解析到结构体中,而非直接转成字符串。 - 完善错误处理:不要忽略
ioutil.ReadAll的错误,同时检查API响应状态码,避免无效解析。
修正后的代码
import ( "encoding/json" "fmt" "net/http" "io/ioutil" ) // 仅保留需要的字段,JSON标签与API返回字段严格对应 type SummonerInfo struct { ID string `json:"id"` SummonerLevel int64 `json:"summonerLevel"` } func getSummonerInfo(a string) (string, error) { req, err := http.NewRequest("GET", "https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/"+a, nil) if err != nil { return "", err } req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36") req.Header.Add("Accept-Language", "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,ja-JP;q=0.6,ja;q=0.5") req.Header.Add("Origin", "https://developer.riotgames.com") req.Header.Add("X-Riot-Token", "RGAPI-195db001-c13f-4412-a9ee-bda6e13baa48") client := &http.Client{} resp, err := client.Do(req) if err != nil { return "", err } defer resp.Body.Close() // 检查API响应状态,非200直接返回错误 if resp.StatusCode != http.StatusOK { return "", fmt.Errorf("API请求失败,状态码: %d", resp.StatusCode) } bytes, err := ioutil.ReadAll(resp.Body) if err != nil { return "", err } var summoner SummonerInfo err = json.Unmarshal(bytes, &summoner) if err != nil { return "", err } // 按需返回格式化字符串或直接返回结构体 result := fmt.Sprintf("召唤师ID: %s, 等级: %d", summoner.ID, summoner.SummonerLevel) fmt.Println(result) return result, nil }
关键说明
- 结构体的
json标签必须和Riot API返回的字段名完全一致,否则解析会失败。 - 替换
panic为返回error,更适合Discord Bot的容错逻辑,避免程序直接崩溃。 - 如果需要后续对数据进行处理,可以把函数返回值改成
(SummonerInfo, error),直接返回结构化数据。
内容的提问来源于stack exchange,提问作者Ensnif
相关产品推荐
相关产品推荐

