iOS 百度翻译API 接口实现效果

昨天接到几个新任务,  第一个是要实现文字翻译功能. 从网上搜索资料发现常用的有百度翻译, 有道翻译 , 谷歌翻译.

三者尽心对比: 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) {
        
    }];
    

猜你喜欢

转载自blog.csdn.net/xfy6238/article/details/79079627