【问题标题】:Bing Translator error -- 'to' must be a valid language必应翻译错误——“to”必须是有效的语言
【发布时间】:2013-12-02 13:10:23
【问题描述】:

这是我调用 api 的方法:

  + (NSString*)bingTranslator:(NSString*)word from:(NSString*)fromLanguage to:(NSString*)toLanguage{


    NSString* token = [PAPUtility bingTranslatorGetToken];

    if (token) {

        NSString* authToken = [@"Bearer " stringByAppendingString:token];

        NSMutableString* authHeader = [NSMutableString stringWithString:@"text="];        

        [authHeader appendString:word];
        [authHeader appendString:@"&to="];
        [authHeader appendString:toLanguage];
        [authHeader appendString:@"&from="];
        [authHeader appendString:fromLanguage];

        NSMutableURLRequest *request =[NSMutableURLRequest
                                       requestWithURL:[NSURL URLWithString:kWSBingTranslatorURL]
                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                       timeoutInterval:60.0];


        [request setHTTPMethod:@"POST"];
        [request addValue:authToken
        forHTTPHeaderField:@"Authorization"];

        const char *bytes = [authHeader UTF8String];
        [request setHTTPBody:[NSData dataWithBytes:bytes length:strlen(bytes)]];


        NSLog(@"word = %@",word);
        NSLog(@"fromLanguage = %@",fromLanguage);
        NSLog(@"toLanguage = %@",toLanguage);
        NSLog(@"authHeader = %@",authHeader);
        NSLog(@"request.URL = %@", request.URL);


        NSURLResponse* response;
        NSError* error;

        NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

        if (data != nil) {
            NSString* contents = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
            NSString *formattedContents = [contents stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

            NSLog(@"formattedContents = %@", formattedContents);

            return formattedContents; 
        }

        return nil;
    }
    return nil;

}

以下是生成的日志语句:

2013-11-25 09:28:52.857 WSPhoto[73703:c07] word = azucarera
2013-11-25 09:28:52.858 WSPhoto[73703:c07] fromLanguage = es
2013-11-25 09:28:52.858 WSPhoto[73703:c07] toLanguage = en
2013-11-25 09:28:57.298 WSPhoto[73703:c07] authHeader = text=azucarera&to=en&from=es
2013-11-25 09:28:57.300 WSPhoto[73703:c07] request.URL = http://api.microsofttranslator.com/v2/Http.svc/Translate?

还有错误日志:

2013-11-25 09:28:57.557 WSPhoto[73703:c07] formattedContents = <html><body><h1>Argument Exception</h1><p>Method: Translate()</p><p>Parameter: to</p><p>Message: 'to' must be a valid language
Parameter name: to</p><code></code><p>message id=3811.V2_Rest.Translate.3F972A8E</p></body></html>

“to”参数记录为en,这是有效的。我尝试将其更改为其他语言,例如de,但出现相同的错误。没看懂,好像有别的事情发生了。

【问题讨论】:

    标签: objective-c bing-api


    【解决方案1】:

    哇哦。自从我出生以来,我从未如此沮丧过。在我解决了原来的错误后,我又弹出了大约 4 个错误,但现在它终于可以工作了。我只是将这两种方法留在这里,用于获取令牌,然后进行翻译。

    + (NSString*)bingTranslatorGetToken{
    
    
        // URL Encode client secret
        NSString *clientSecret = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                                              (CFStringRef)kWSBingTranslatorClientSecret,
                                                                                              NULL,
                                                                                              (CFStringRef) @"!*'();:@&=+$,/?%#[]",
                                                                                              kCFStringEncodingUTF8);
        NSMutableString* authHeader = [NSMutableString stringWithString:@"client_id="];
        [authHeader appendString:kWSBingTranslatorClientID];
        [authHeader appendString:@"&client_secret="];
        [authHeader appendString:clientSecret];
        [authHeader appendString:@"&grant_type=client_credentials&scope=http://api.microsofttranslator.com"];
    
    
    
        NSMutableURLRequest *request =[NSMutableURLRequest
                                       requestWithURL:[NSURL URLWithString:kWSBingTranslatorTokenURL]
                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                       timeoutInterval:60.0];
    
        [request setHTTPMethod:@"POST"];
        [request addValue:@"application/x-www-form-urlencoded"
        forHTTPHeaderField:@"Content-Type"];
    
        const char *bytes = [authHeader UTF8String];
        [request setHTTPBody:[NSData dataWithBytes:bytes length:strlen(bytes)]];
    
        NSURLResponse* response;
        NSError* error;
    
        NSData* data = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];
    
    
        if (data != nil) {
    
            // Get the access_token object from data
            NSDictionary* json = [NSJSONSerialization
                                  JSONObjectWithData:data
    
                                  options:kNilOptions
                                  error:&error];
    
            NSString* accessToken = [json objectForKey:@"access_token"];
    
            return accessToken;
        }
    
    
    
        return nil;
    }
    
    + (NSString*)bingTranslator:(NSString*)word from:(NSString*)fromLanguage to:(NSString*)toLanguage{
    
        NSString* token = [PAPUtility bingTranslatorGetToken];
    
        if (token) {
    
            NSString* authToken = [@"Bearer " stringByAppendingString:token];
    
            NSMutableString* authHeader = [NSMutableString stringWithString:@"text="];
    
            [authHeader appendString:word];
            [authHeader appendString:@"&from="];
            [authHeader appendString:fromLanguage];
            [authHeader appendString:@"&to="];
            [authHeader appendString:toLanguage];
            [authHeader appendString:@"&contentType="];
            [authHeader appendString:@"text/plain"];
    
            NSString* urlString = [kWSBingTranslatorURL stringByAppendingString:authHeader];
    
            // EDIT -- Needed to add this line to escape accents
            urlString = [urlString stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
    
            NSMutableURLRequest *request =[NSMutableURLRequest
                                           requestWithURL:[NSURL URLWithString:urlString]
                                           cachePolicy:NSURLRequestUseProtocolCachePolicy
                                           timeoutInterval:60.0];
    
    
            [request setHTTPMethod:@"GET"];
            [request addValue:authToken
            forHTTPHeaderField:@"Authorization"];
    
    
            NSURLResponse* response;
            NSError* error;
    
            NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    
            if (data != nil) {
                NSString* contents = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
    
                // An NSString category
                contents = [contents stringByStrippingHTML];
    
                return contents;
            }
    
            return nil;
        }
        return nil;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 2019-06-05
      • 2012-03-01
      • 1970-01-01
      相关资源
      最近更新 更多