Как передать ключ учетной записи Windows Azure Marketplace в NSURLSession?

Я успешно выполняю запросы изображений в «Поиске Google» со следующим кодом:

NSMutableCharacterSet * URLQueryPartAllowedCharacterSet;
URLQueryPartAllowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
[URLQueryPartAllowedCharacterSet removeCharactersInString:@"&+=?"]; 
NSString * escapedValue = [searchKeys stringByAddingPercentEncodingWithAllowedCharacters:URLQueryPartAllowedCharacterSet];
NSString * urlString = [[NSString alloc] initWithFormat:@"https://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=%@", escapedValue];
NSURL *JSONURL = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:JSONURL];

NSURLSessionDataTask * dataTask = [[NSURLSession sharedSession] 
dataTaskWithRequest:request
    completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {                                    

NSDictionary *googleResult = [NSJSONSerialization JSONObjectWithData:data 
           options:NSJSONReadingMutableContainers
           error:nil];

// PROCESS GOOGLE RESULTS HERE...
}];

[dataTask resume];

... пока Google не решил ограничить доступ. Теперь я хотел бы реализовать то же самое с Microsoft Bing! (рынок Windows Azure). Я получил ключ учетной записи (чтобы получать 5000 бесплатных поисков в месяц).

Я понимаю, что мне нужно передать ключ учетной записи как часть запроса.

Как я могу изменить свой код, чтобы реализовать это?


person Pablo Alfonso    schedule 24.11.2015    source источник


Ответы (2)


Если это запрос GET, вы можете просто добавить еще один запрос в конец строки URL, но если это запрос POST, вы можете использовать

NSString *constructedParam = @"key=value&key=value";
NSData *parameterData = [constructedParam dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
[request addValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:parameterData]
person Ansel    schedule 24.11.2015

Спасибо. Я смог решить проблему после прочтения некоторой документации от Microsoft. Это необходимый код:

// Method required to encode data...
-(NSString *)stringByEncodingInBase64:(NSData *)data
{
    NSUInteger length = [data length];
    NSMutableData *mutableData = [[NSMutableData alloc] initWithLength:((length + 2) / 3) * 4];


uint8_t *input = (uint8_t *)[data bytes];
uint8_t *output = (uint8_t *)[mutableData mutableBytes];

for (NSUInteger i = 0; i < length; i += 3)
{
    NSUInteger value = 0;
    for (NSUInteger j = i; j < (i + 3); j++)
    {
        value <<= 8;
        if (j < length)
        {
            value |= (0xFF & input[j]);
        }
    }

    static uint8_t const kAFBase64EncodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    NSUInteger idx = (i / 3) * 4;
    output[idx + 0] = kAFBase64EncodingTable[(value >> 18) & 0x3F];
    output[idx + 1] = kAFBase64EncodingTable[(value >> 12) & 0x3F];
    output[idx + 2] = (i + 1) < length ? kAFBase64EncodingTable[(value >> 6)  & 0x3F] : '=';
    output[idx + 3] = (i + 2) < length ? kAFBase64EncodingTable[(value >> 0)  & 0x3F] : '=';
}

return [[NSString alloc] initWithData:mutableData encoding:NSASCIIStringEncoding];
}

Ниже приведен код для получения результатов поиска:

NSData *authData;
NSString *authKey = @"<ENTER Windows Azure Marketplace Account KEY HERE>";
        NSLog (@"authkey:%@",authKey);
        authData = [[[NSString alloc] initWithFormat:@"%@:%@", authKey, authKey] dataUsingEncoding:NSUTF8StringEncoding];
        NSString *authValue = [[NSString alloc] initWithFormat:@"Basic %@", [self stringByEncodingInBase64:authData]];

    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    [config setHTTPAdditionalHeaders:@{@"Authorization": authValue}];


    NSMutableCharacterSet * URLQueryPartAllowedCharacterSet;
    URLQueryPartAllowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
    [URLQueryPartAllowedCharacterSet removeCharactersInString:@"&+=?"]; // %26, %3D, %3F
    NSString * escapedValue = [<ENTER SEARCH CRITERIA HERE> stringByAddingPercentEncodingWithAllowedCharacters:URLQueryPartAllowedCharacterSet];
    NSString * urlString = [[NSString alloc] initWithFormat:@"https://api.datamarket.azure.com/Data.ashx/Bing/Search/v1/Image?Query='%@'&$top=50&$format=json", escapedValue];
    NSURL *JSONURL = [NSURL URLWithString:urlString];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:JSONURL];
    NSURLSessionDataTask * dataTask = [[NSURLSession sessionWithConfiguration:config] dataTaskWithRequest:request  
                                completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        if(data == nil){
            // Process failure here.
        }

        NSDictionary *resultadoCompleto = [NSJSONSerialization JSONObjectWithData:data
                                                                          options:NSJSONReadingMutableContainers
                                                                            error:nil];

       // PROCESS BING! RESULTS HERE...

     }];

[dataTask resume];

resultadoCompleto показывает полные результаты!

person Pablo Alfonso    schedule 26.11.2015