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

使用FreeDictionaryAPI开发Discord机器人时遇404错误求助

问题修复方案

核心问题分析

你遇到的404错误根源是传递给API的不是纯单词:ctx.Message.Content会包含完整的命令内容(比如用户输入!dict apple时,Message.Content是!dict apple),直接拼接URL后变成https://api.dictionaryapi.dev/api/v2/entries/en/!dict apple,这显然不符合API的请求格式,导致返回404。

另外,GetStringAsync内部会自动调用EnsureSuccessStatusCode(),所以非2xx状态码会直接抛出异常;而GetAsync不会自动抛异常,但你之前改用它后程序无法运行,大概率是没正确处理响应内容读取,或者依然用了错误的URL。

代码修复步骤

1. 修正命令参数获取

使用Discord.Net的参数绑定功能,直接提取用户输入的单词,而不是拿整个消息内容:

public class DictionaryCommand : BaseCommandModule
{
    [Command("dict")]
    // [RemainingText] 用于处理带空格的短语(比如 "break up")
    public async Task DictCommand(CommandContext ctx, [RemainingText] string word)
    {
        var dictionary = new DictionaryOutput();
        string definition = await dictionary.GetDefinition(word);
        
        if (!string.IsNullOrEmpty(definition))
            await ctx.Channel.SendMessageAsync(definition);
        else
            await ctx.Channel.SendMessageAsync("未找到该单词/短语的释义");
    }
}

2. 重构GetDefinition方法

  • 对单词进行URL编码,避免特殊字符(空格、撇号等)导致的URL无效
  • 手动检查响应状态码,避免无差别抛出异常
  • 返回字符串结果而非依赖类字段,代码更健壮:
public async Task<string> GetDefinition(string word)
{
    if (string.IsNullOrWhiteSpace(word))
        return null;

    // 对单词进行URL编码,处理特殊字符
    string encodedWord = Uri.EscapeDataString(word.Trim());
    string dictionaryUrl = $"https://api.dictionaryapi.dev/api/v2/entries/en/{encodedWord}";

    // 最佳实践:HttpClient应复用单例,不要每次创建(可放到类级别静态字段)
    using (var client = new HttpClient())
    {
        try
        {
            HttpResponseMessage response = await client.GetAsync(dictionaryUrl);
            
            // 检查响应状态
            if (!response.IsSuccessStatusCode)
            {
                if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
                    Console.WriteLine($"未找到单词: {word}");
                else
                    Console.WriteLine($"API请求错误,状态码: {response.StatusCode}");
                return null;
            }

            string responseContent = await response.Content.ReadAsStringAsync();
            List<Word>? wordData = JsonSerializer.Deserialize<List<Word>>(responseContent);
            
            // 处理API返回空数据的情况
            if (wordData == null || wordData.Count == 0)
                return null;
            
            // 取第一个释义,可根据需求扩展为返回多个释义
            return wordData[0].meanings[0].definitions[0].definition;
        }
        catch (Exception ex)
        {
            Console.WriteLine("请求异常: {0}", ex.Message);
            return null;
        }
    }
}

额外优化建议

  • HttpClient复用:每次创建HttpClient会消耗过多资源,建议将其定义为类的静态字段或依赖注入单例
  • 多释义处理:API会返回多个释义和词性,可修改代码将所有释义格式化后返回给用户
  • 错误提示本地化:根据不同错误状态码返回更友好的Discord消息

内容的提问来源于stack exchange,提问作者Michael Yang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:22:25