2015-07-08 3 views
0

Я новый разработчик Objective-C, и я взаимодействую с API в формате cURL. Я привык звонить с использованием URL-адресов, поэтому я собрал запрос от того, что я нашел в интернетах. Я все еще не могу извлечь данные в своем приложении.Перевод запроса cURL на NSMutableURLRequest

Это оригинальный запрос локонов (с фиктивными ключами, конечно):

curl -v -H "app_id:12345" -H "app_key:abcdefg" -X POST "http://data.host.com/object" -d '{"Page":0,"Take":10}' 

Это моя попытка:

//Request 
    NSURLSession *session = [NSURLSession sharedSession]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://data.host.com/object"]]; 

    //Set method 
    request.HTTPMethod = @"POST"; 

    //Set parameters 
    NSDictionary *parameters = @{ 
           @"Page": @(0), 
           @"Take": @(10) 
           }; 

    NSMutableString *parameterString = [NSMutableString string]; 
    for (NSString *key in [parameters allKeys]) { 
     if ([parameterString length]) { 
      [parameterString appendString:@"&"]; 
     } 
     [parameterString appendFormat:@"%@=%@", key, parameters[key]]; 
    } 
    NSLog(@"PARAMETER STRING: %@",parameterString); 

    //Set headers 
    [request setValue:@"12345" forHTTPHeaderField:@"app_id"]; 
    [request setValue:@"abcdefg" forHTTPHeaderField:@"app_key"]; 
    [request setHTTPBody:[parameterString dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
     if (!error) { 
      if ([data length]) { 
       NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
       NSLog(@"JSON RESPONSE: %@", jsonResponse); 
      } 
     } else { 
      NSLog(@"%@", error); 
     } 
    }]; 
    [task resume]; 
    NSLog(@"TASK: %@", task); 

Я не получаю сообщение об ошибке, но jsonResponse возвращает NULL , У кого-нибудь есть идея о том, что мне не хватает? Заранее спасибо!

ответ

1

Вы увидите разницу, если вы сравнили обмен сообщениями HTTP между версией curl и версией obj-c. AFAICS вам не хватает заголовка для типа содержимого, где вы указываете кодировку тела. При публикации вам необходимо передать информацию о том, как вы кодируете тело. Вот пример кода из одного из моих приложений:

- (NSURLRequest *)createPostRequestWithURL:(NSURL *)url 
          parameters:(NSDictionary *)parameters { 

    NSLog(@"startGetTaskForUrl: %@, params %@", url, parameters); 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPMethod:@"POST"]; 
    [request addValue:@"application/x-www-form-urlencoded" 
    forHTTPHeaderField:@"Content-Type"]; 
    NSString * httpParams = [self createHttpParameters:parameters]; 
    NSLog(@"HTTPClient: postRequestWithURL body: %@", httpParams); 
    [request setHTTPBody:[httpParams dataUsingEncoding:NSUTF8StringEncoding]]; 
    return request; 
} 

- (NSString *)urlEncodedUTF8String: (NSString *) source { 
    return (id)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(0, (CFStringRef)source, 0, 
                 (CFStringRef)@";/?:@&=$+{}<>,", kCFStringEncodingUTF8)); 
} 

- (NSString *) createHttpParameters: (NSDictionary *) parameters { 
    NSMutableString *body = [NSMutableString string]; 
    for (NSString *key in parameters) { 
     NSString *val = [parameters objectForKey:key]; 
     if ([body length]) 
      [body appendString:@"&"]; 
     [body appendFormat:@"%@=%@", [self urlEncodedUTF8String: [key description]], 
     [self urlEncodedUTF8String: [val description]]]; 
    } 
    return body; 
}