一次微软翻译代码设计引发的思考

业务需求

之前,用的是google的翻译接口..但是好像,针对太过口语化就不太翻译的准.所以.就打算换微软翻译试一下

微软翻译和google翻译的区别

google翻译步骤,数据格式json

  • google翻译只需要请求接口的时候带上appId就可以了

微软翻译翻译步骤,数据格式是坑爹的XML

  • 第一步,根据appId获取issueToken

    这个issueToken有过期时间,而且请求时间特别长.一旦这个key过期了..那么翻译的时候就会报错 微软的翻译服务器在香港,时间差不多2S 1.5秒是请求issueToken 0.5s是走翻译,所以考虑存储这个issueToken

  • 第二步带着未过期的key,去请求翻译api,从xml中解析出翻译的内容

自己画了一个设计图吧,大家也可以想想,这个代码怎么写最优

其实坑就在我用绿色箭头那个位置的循环调用

file

最开始的傻逼代码

呃...给弄丢了...反正是有问题的,我是方法之间的循环调用的,凭着记忆 又写了一遍,但是好像也没什么问题😂 😂 😂

public function getContent ($url)
{
    if(Redis::exists('microsoft_translator_access_token')){
        $accessToken = Redis::get('microsoft_translator_access_token');
    }else{
        $accessToken = $this->getMicrosoftToken(config('app.microsoft_azure_key'));
        Redis::set('microsoft_translator_access_token',$accessToken);
    }
    $authHeader = "Authorization: Bearer ". $accessToken;
    $response = $this->curlRequest($url,$authHeader);
    $response = (array)simplexml_load_string($response);
    if(isset($response['body'])){
        //翻译失败重新生成key
        $accessToken = $this->getMicrosoftToken(config('app.microsoft_azure_key'));
        //更新key
        Redis::set('microsoft_translator_access_token',$accessToken);
        //循环调用
        $this->getContent($url);
    }else{
        return $response[0];
    }
}

优化之后的代码

//检查Redis中是否有数据
if(Redis::exists('microsoft_translator_access_token')){
    $accessToken = Redis::get('microsoft_translator_access_token');
}else{
    //获得issueToken
    $accessToken = $this->getMicrosoftToken(config('app.microsoft_azure_key'));
    Redis::set('microsoft_translator_access_token',$accessToken);
}
//拼接issueToken
$authHeader = "Authorization: Bearer ". $accessToken;
//调用翻译接口
while (! $content = $this->microsoftGetContent($url,$authHeader)){
    //获得issueToken
    $accessToken = $this->getMicrosoftToken(config('app.microsoft_azure_key'));
    $authHeader = "Authorization: Bearer ". $accessToken;
    Redis::set('microsoft_translator_access_token',$accessToken);
}
return $content;

microsoftGetContent方法代码

public function microsoftGetContent ($url,$authHeader)
{
    $response = $this->curlRequest($url,$authHeader);
    //xml转数组,都什么年代了 ,还用xml
    $response = (array)simplexml_load_string($response);
    if(isset($response['body'])){
        return false;
    }else{
        return $response[0];
    }
}

总结

平时太少用到while语句了..遇到这种循环调用的感觉while还挺好用