Pregunta

Here's my method to call the 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;

}

Here are the resulting log statements:

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?

And the error log:

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>

The 'to' parameter is logging as en, which is valid. I've tried changing it to other languages such as de but with the same error. I don't get it, it seems like something else is going on.

¿Fue útil?

Solución

Oh wow. I haven't been this frustrated since I was birthed. I had about 4 more errors pop up after I resolved the original one, but now it's finally working. I'm just going to leave the two methods here for getting a token and then a translation.

+ (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;

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top