You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

解决步骤

  1. 定义目标结构体:只声明需要的字段,注意Riot API中召唤师等级的字段名是summonerLevel,不是你提到的level。
  2. 解析JSON响应:用encoding/json包将响应体解析到结构体中,而非直接转成字符串。
  3. 完善错误处理:不要忽略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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 16:35:13