昨天接到几个新任务, 第一个是要实现文字翻译功能. 从网上搜索资料发现常用的有百度翻译, 有道翻译 , 谷歌翻译.
三者尽心对比: 1. 百度每月200万字符下免费
2. 有道收费,初始送100元体验金
3.谷歌翻译纯英文文档.
综合考虑, 百度翻译免费,支持语言更多,决定使用百度翻译.
前期准备大致相同,注册账号,申请APPID和密钥. 一个账号只能申请一个ID, 如果你有多个APP 那就需要多个账号进行申请.
前期准备略过,看文档就可以了.
文档不多,并且没有oc版本.
百度提供了接口进行网络请求,返回翻译结果. 文档中说可以用get也可以post,我使用的是get.
接口中必须要写入的参数:
q:待翻译的文本;
from: 待翻译文本语言
to: 目标语言
APPID: 申请的APPID
salt: 随机数, 文档中没有详细说这个,我从网上其他人的博客中看到可以使用文档中提供的随机数,猜测可能是只要长度为10位的数字都可以,但是我并没有去验证,仍是使用的文档提供的随随机数.
sign: 签名; 按照文档,将APPID,q,salt,密钥 拼接, 之后进行utf-8编码,然后MD5加密,得到签名.
待翻译文字需要utf-8编码,是因为如果待翻译的文字是中文,网络请求并不支持中文,需要将文字进行utf-8编码.
但是在我按照文档进行时,出现了几个问题:
1.只能翻译单个英文单词,不能翻译英文句子.
2.无法将中文翻译成英文.
错误代码是 54001: sign(签名)错误.
我在这里卡了很长时间,完全不知道错误出在哪里.
在参考完一篇博客之后,我找到了问题所在.
文档中是这样描述签名生成的:"计算签名sign(对字符串1做md5加密,注意计算md5之前,串1必须为UTF-8编码)"
但是这一句话并不是完全正确的.
这里的 字符串1 是将APPID,q,salt,密钥 拼接起来的结果, 按照文档接下来是进行utf-8编码,然后MD5加密.
最重要的:
编码: 在iOS9之前我们使用stringByAddingPercentEscapesUsingEncoding 进行utf-8编码,但是此方法在iOS10中被废弃了.所以你会使用哪个方法来编码呢?
如果你使用旧的方法进行编码,问题就解决了, 我上面遇到的两个问题都解决了.
如果你使用新的方法进行编码,不好意思,你就会遇到我遇到的问题.
那我们只能使用旧方法了吗,毕竟已经是被废弃了.
然后我试了试一种情况,发现这样也可以. 那就是: 字符串1不进行utf-8编码,直接进行加密, 当然请求时的utf-8编码还是必须的. 这样操作之后,问题解决了.
所以,拼接之后,完全不用utf-8编码,直接加密就可以了. 即使你的待翻译文字是中文.
这次功能主要参考了两篇博客,非常感谢. 博客中有什么不对的地方,请不吝赐教.
以下是完整的请求代码:
_inputText = _inputTextView.text;
// _inputText = @"今天 是个 好天气";
//百度API
NSString *httpStr = @"https://fanyi-api.baidu.com/api/trans/vip/translate";
//将APPID q salt key 拼接一起
NSString *appendStr = [NSString stringWithFormat:@"%@%@%@%@",kBaiduTranslationAPPID,_inputText,kBaiduTranslationSalt,kBaiduTranslationKey];
//将拼接之后的字符串进行utf-8转码
//[appendStr stringByRemovingPercentEncoding:[NSCharacterSet URLQueryAllowedCharacterSet]];
// NSString *appendEncoding = [appendStr stringByRemovingPercentEncoding];
// NSString *appendEncoding = [appendStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// NSLog(@"&&&&&&&%@",appendStr);
//加密 生成签名
NSString *md5Str = [self md5:appendEncoding];
//将待翻译的文字机型urf-8转码
NSString *qEncoding = [_inputText stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
//使用get请求
NSString *urlStr = [NSString stringWithFormat:@"%@?q=%@&from=%@&to=%@&appid=%@&salt=%@&sign=%@",httpStr,qEncoding,@"auto",@"en",kBaiduTranslationAPPID,kBaiduTranslationSalt,md5Str];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//添加共有参数
[manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
manager.requestSerializer.timeoutInterval = 20.f;
[manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
[manager GET:urlStr parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (responseObject == nil) {
return ;
}
//获取翻译后的字符串
NSString *resStr = [[responseObject objectForKey:@"trans_result"] firstObject][@"dst"];
self.outputTextView.text = resStr;
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];