Microsoft Translator API迁移Azure后400错误及代码适配咨询
400错误的原因分析
出现400错误主要有两个核心原因:
- 旧端点已停用:你现在调用的
http://api.microsofttranslator.com/v2/Http.svc/Translate是旧版Microsoft Translator的服务端点,Azure Cognitive Services接管后,这个旧端点不再支持新的认证方式,直接调用必然触发错误。 - 认证方式失效:原来获取token的
https://datamarket.accesscontrol.windows.net/v2/OAuth2-13端点早已被废弃,加上你公司丢失的旧id和secret对应的旧订阅也已失效,生成的token无法通过服务器校验,最终返回400错误。
代码修改方案(适配Azure版Translator API)
首先你需要在Azure门户创建Translator Text资源,拿到对应的Ocp-Apim-Subscription-Key(这是唯一需要的新凭据,旧的id和secret完全不需要再用了),然后按以下步骤修改代码:
1. 更新Token获取函数
Azure Translator的token获取端点换成了https://api.cognitive.microsoft.com/sts/v1.0/issueToken,请求方式为POST,只需在请求头里携带你的订阅密钥即可:
// 替换成你从Azure获取的Translator订阅密钥 def subscriptionKey = "你的Azure订阅密钥" def getToken = { def client = new RESTClient("https://api.cognitive.microsoft.com/sts/v1.0/issueToken") try{ // 发送POST请求,仅需在请求头携带订阅密钥 client.post( headers: ["Ocp-Apim-Subscription-Key": subscriptionKey] ).text // 返回纯文本格式的token,直接使用即可 } catch(e){ e.printStackTrace(); return null; } }
小提示:这个token有效期为10分钟,建议加个缓存逻辑,避免每次翻译都请求token,提升效率。
2. 更新翻译请求函数
这里提供两个选项,一个是兼容原有XML返回的v2端点方案,另一个是更推荐的v3端点方案(更稳定,长期支持更有保障):
选项1:兼容原有v2端点(XML返回)
如果想尽量贴近原有代码的返回格式,可以用这个方案,仅更新认证逻辑:
public String translate(String text, String from, String to){ def token = getToken() if (!token) return null def client = new RESTClient("http://api.microsofttranslator.com/v2/Http.svc/Translate") def response = client.get( query: [text: text, from: from, to: to], headers: ["Authorization": "Bearer ${token}"] ) // 提取XML响应中的翻译文本 return response.xml.text() }
选项2:迁移到v3端点(JSON返回,推荐)
v3是Azure Translator的最新版本,返回JSON格式更易解析,长期支持更有保障:
public String translate(String text, String from, String to){ def token = getToken() if (!token) return null def client = new RESTClient("https://api.cognitive.microsofttranslator.com/translate?api-version=3.0") def response = client.post( query: [from: from, to: to], headers: [ "Authorization": "Bearer ${token}", "Content-Type": "application/json" ], body: [[Text: text]] // v3要求用JSON数组传递要翻译的文本 ) // 解析JSON响应,提取翻译后的文本 return response.json[0].translations[0].text }
关于旧凭据的说明
原来的id和secret是旧版Microsoft Translator市场的凭据,现在已完全废弃,加上你公司已经丢失这些凭据,所以完全不需要再使用它们。仅需使用Azure新生成的Ocp-Apim-Subscription-Key即可完成所有认证。
额外提示
- 如果你使用v3端点,且Translator资源在指定区域(比如eastasia),需要在请求头里加上
Ocp-Apim-Subscription-Region: 你的资源区域,否则可能会报错。 - 关于日期格式:翻译后你可以对结果做进一步处理,把返回的日期文本调整成你需要的
dd MMM yyyy格式(比如拆分月份和日期,重新组合成“六 日 十二 月 二零一七年”这样的格式)。
内容的提问来源于stack exchange,提问作者Davia




