用 net/http 调翻译 api 必须设 user-agent,否则易 403;响应需先验 statuscode 和原始内容再解 json;url 参数用 url.queryescape;并发请求须设 http.client 超时。

用 net/http 发起翻译请求时,别漏掉 User-Agent
很多初学者直接用 http.Get 调第三方翻译 API(比如百度、腾讯的免费接口),结果返回 403 或空响应——大概率是服务端拒绝了无 User-Agent 的请求。这类接口普遍把空 User-Agent 当爬虫拦截。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 必须手动构造
*http.Request,用req.Header.Set("User-Agent", "Mozilla/5.0")补上头信息 - 别用
http.Get简写,它不提供设置 header 的入口 - 如果调的是自建或内网翻译服务,可忽略;但凡走公网,一律加
User-Agent
处理 JSON 响应时,json.Unmarshal 报 invalid character 怎么办
常见错误现象:HTTP 状态码是 200,但 json.Unmarshal 直接 panic,提示 invalid character 'h' looking for beginning of value——说明响应体根本不是 JSON,可能是 HTML 错误页(比如 404 页面)或纯文本。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 先检查
resp.StatusCode,非 200 就别急着解码 - 用
io.ReadAll(resp.Body)拿到原始字节,打印前 100 字符看真实内容 - 翻译 API 返回的 JSON 通常有
error_code字段,要先解析顶层结构体再判断业务错误,不能只靠 HTTP 状态码
中文 URL 编码容易错在 url.QueryEscape 和 url.PathEscape 混用
想把待翻译文本拼进 URL(如 https://api.example.com/translate?q=你好),直接用 url.QueryEscape("你好") 是对的;但如果误用 url.PathEscape("你好"),会生成 %E4%BD%A0%E5%A5%BD 这种路径编码,而多数翻译 API 要求 query 参数用标准 URL 查询编码(结果一样,但语义和部分服务校验逻辑不同)。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 参数放在 query string 里(即
?key=value形式),统一用url.QueryEscape - 参数作为 path segment(如
/v1/translate/你好),才用url.PathEscape - 更稳妥的做法:用
url.Values构建 query,它内部自动调用QueryEscape
并发调用多个翻译源时,http.Client 的 Timeout 必须显式设
没设超时的 http.Client 在网络抖动或后端卡顿时会永久阻塞 goroutine,几个并发就拖垮整个工具。这不是翻译逻辑的问题,而是 Go 网络层的基本约束。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 永远用带超时的 client:
client := &http.Client{Timeout: 5 * time.Second} - 别依赖全局
http.DefaultClient,它默认无超时 - 如果需要重试,用
retryablehttp这类库,而不是自己循环调client.Do—— 容易漏关 body 或重复超时
翻译工具真正难的不是发请求或解 JSON,是各家 API 对字符集、错误码、配额返回方式的细微差异。比如百度要求 q 参数 UTF-8 编码后还要做 URL encode,而 DeepL 的 text 字段直接传原始字符串就行——这些细节不查文档,光靠试错很容易卡半天。










