C#调用DeepL API遭遇HTTP 403 Forbidden错误求助
解决DeepL API请求403 Forbidden错误的方案
核心错误原因分析
- 请求方式不符合要求:DeepL翻译API仅接受POST请求,当前使用的GET请求会被服务器拒绝,返回403。
- 参数名错误:使用了
target_langs参数,但DeepL API的正确参数名是target_lang,且单次请求仅支持一个目标语言。 - API密钥格式问题:免费版DeepL API密钥必须以
:fx结尾,若密钥缺少该后缀,会导致认证失败。 - URL未编码:直接拼接文本到URL中,若包含特殊字符会破坏请求格式,进一步触发服务器拦截。
修复步骤与代码修改
1. 确认API密钥格式
确保免费版密钥格式为xxxxxx:fx,例如f0798faa-xxxx-xxxx-xxxx-xxxxxxxx:fx。
2. 改用POST请求并修正参数
将原GET请求改为POST,使用表单格式传递参数,同时对每个选中的目标语言单独发起请求(因DeepL不支持单次请求多目标语言)。另外,使用async/await优化异步请求逻辑,避免死锁。
修改后的BtnTranslate_Click方法代码:
private async void BtnTranslate_Click(object sender, RoutedEventArgs e) { string text = txtInput.Text; if (string.IsNullOrWhiteSpace(text)) { MessageBox.Show("请输入要翻译的文本", "提示", MessageBoxButton.OK, MessageBoxImage.Information); return; } List<string> targetLanguages = new List<string>(); if (chkEnglish.IsChecked.Value) targetLanguages.Add("EN-GB"); if (chkCzech.IsChecked.Value) targetLanguages.Add("CS"); if (chkSpanish.IsChecked.Value) targetLanguages.Add("ES"); if (chkPortuguese.IsChecked.Value) targetLanguages.Add("PT-BR"); if (chkFrench.IsChecked.Value) targetLanguages.Add("FR"); if (!targetLanguages.Any()) { MessageBox.Show("请至少选择一个目标语言", "提示", MessageBoxButton.OK, MessageBoxImage.Information); return; } StringBuilder sbOutput = new StringBuilder(); sbOutput.AppendLine("{i18n de}").AppendLine(text).AppendLine("{/i18n}"); using (HttpClient client = new HttpClient()) { client.DefaultRequestHeaders.Add("Authorization", $"DeepL-Auth-Key {API_KEY}"); foreach (var targetLang in targetLanguages) { try { var formData = new Dictionary<string, string> { {"text", text}, {"source_lang", "DE"}, {"target_lang", targetLang} }; var response = await client.PostAsync(API_URL, new FormUrlEncodedContent(formData)); if (response.IsSuccessStatusCode) { string jsonResponse = await response.Content.ReadAsStringAsync(); JObject json = JObject.Parse(jsonResponse); var translation = json["translations"][0]["text"].ToString(); sbOutput.AppendLine($"{{i18n {targetLang.ToLower()}}}") .AppendLine(translation) .AppendLine("{/i18n}"); } else { string errorContent = await response.Content.ReadAsStringAsync(); MessageBox.Show($"翻译{targetLang}时出错: {response.StatusCode}\n错误详情: {errorContent}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } catch (Exception ex) { MessageBox.Show($"翻译{targetLang}时发生异常: {ex.Message}", "异常", MessageBoxButton.OK, MessageBoxImage.Error); } } txtOutput.Text = sbOutput.ToString(); } }
3. 其他注意事项
- 确保API密钥未泄露,且账户未超出免费版调用额度。
- 若使用付费版DeepL API,需将
API_URL改为https://api.deepl.com/v2/translate,密钥无需:fx后缀。
内容的提问来源于stack exchange,提问作者MKa
相关产品推荐
相关产品推荐

