You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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端点早已被废弃,加上你公司丢失的旧idsecret对应的旧订阅也已失效,生成的token无法通过服务器校验,最终返回400错误。
代码修改方案(适配Azure版Translator API)

首先你需要在Azure门户创建Translator Text资源,拿到对应的Ocp-Apim-Subscription-Key(这是唯一需要的新凭据,旧的idsecret完全不需要再用了),然后按以下步骤修改代码:

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
}
关于旧凭据的说明

原来的idsecret是旧版Microsoft Translator市场的凭据,现在已完全废弃,加上你公司已经丢失这些凭据,所以完全不需要再使用它们。仅需使用Azure新生成的Ocp-Apim-Subscription-Key即可完成所有认证。

额外提示
  • 如果你使用v3端点,且Translator资源在指定区域(比如eastasia),需要在请求头里加上Ocp-Apim-Subscription-Region: 你的资源区域,否则可能会报错。
  • 关于日期格式:翻译后你可以对结果做进一步处理,把返回的日期文本调整成你需要的dd MMM yyyy格式(比如拆分月份和日期,重新组合成“六 日 十二 月 二零一七年”这样的格式)。

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

火山引擎 最新活动