GO SDK调用Google Translation API返回HTML而非JSON响应问题求解
问题原因
你遇到的返回HTML格式错误的情况,既不是配置遗漏也不是Go SDK的问题,是Google Cloud API网关的拦截逻辑导致的:当请求的错误属于基础格式类错误(还没进入翻译服务的业务逻辑层)时,网关会直接返回HTML格式的通用错误页,没有返回SDK可自动解析的结构化JSON错误,因此SDK只能将完整响应体拼接进错误信息中,无法直接输出纯文本错误。
排查触发400的常见原因
你可以先逐一核对以下配置项,先从根源解决报错问题:
- 核对使用的API密钥是否正确,无多余空格、未过期、未被禁用
- 确认传入的源语言、目标语言编码符合ISO 639-1规范
- 检查待翻译的文本数组,单条文本长度未超出Google翻译API的5000字符限制,无异常特殊字符
- 确认你使用的Google Cloud项目已经启用了Cloud Translation API服务
提取纯文本错误的实现方法
如果需要不管错误类型都提取纯文本提示,可以通过类型断言+HTML解析的方式处理,示例代码如下:
import ( "google.golang.org/api/googleapi" "golang.org/x/net/html" "strings" ) // 解析Google API错误返回纯文本 func parseGoogleAPIError(err error) string { // 先断言是不是googleapi的错误类型 gerr, ok := err.(*googleapi.Error) if !ok { return err.Error() } // 尝试解析HTML内容提取错误文本 doc, err := html.Parse(strings.NewReader(gerr.Body)) if err != nil { // 解析失败直接返回原始错误信息 return gerr.Error() } // 遍历HTML节点找p标签里的错误内容 var extract func(*html.Node) string extract = func(n *html.Node) string { if n.Type == html.ElementNode && n.Data == "p" { // 匹配到p标签,提取文本,排除冗余内容 var text string for c := n.FirstChild; c != nil; c = c.NextSibling { if c.Type == html.TextNode { text += c.Data } } text = strings.TrimSpace(text) if strings.HasPrefix(text, "Your client has issued") { return text } } for c := n.FirstChild; c != nil; c = c.NextSibling { if res := extract(c); res != "" { return res } } return "" } res := extract(doc) if res != "" { return res } return gerr.Error() }
你在调用翻译方法拿到错误后,直接调用parseGoogleAPIError(err)就能拿到需要的纯文本错误内容。
内容的提问来源于stack exchange,提问作者Amandeep kaur
相关产品推荐
相关产品推荐

