Подтвердить что ты не робот

Wanted: обновленный пример для JSON/POST с базовым авторизацией с использованием AFNetworking-2

У меня есть игрушечное приложение, которое отправляет https JSON/POST, используя базовую безопасность. Мне сказали, что мне следует использовать AFNetworking. Я смог установить AFNetwork-2 в мой проект XCode (цель ios7, XCode5) просто отлично. Но ни один из примеров, похоже, не имеет отношения к текущим версиям AFNetworking-2, а скорее к предыдущим версиям. Документы AFNetworking довольно скудны, поэтому я борюсь за то, как объединить их. Код без AFNetworking выглядит примерно так:

NSURL *url = [NSURL URLWithString:@"https://xxx.yyy.zzz.aaa:bbbbb/twig_monikers"];
NSMutableURLRequest *request = [NSMutableURLRequest
    requestWithURL:url
    cachePolicy: NSURLRequestUseProtocolCachePolicy
    timeoutInterval: 10.0];

NSData *requestData = [NSJSONSerialization dataWithJSONObject: [self jsonDict] options: 0 error: nil];
[request setHTTPMethod: @"POST"];
[request setValue: @"application/json" forHTTPHeaderField: @"Accept"];
[request setValue: @"application/json" forHTTPHeaderField: @"Content-Type"];
[request setValue:[NSString stringWithFormat: @"%d", [requestData length]] forHTTPHeaderField: @"Content-Length"];
NSData *plainPassText = [@"app_pseudouser:sample_password" dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64PassText = [plainPassText base64EncodedStringWithOptions: NSDataBase64Encoding76CharacterLineLength];
[request setValue:[NSString stringWithFormat: @"Basic %@", base64PassText] forHTTPHeaderField: @"Authorization"];

FailedCertificateDelegate *fcd=[[FailedCertificateDelegate alloc] init];
NSURLConnection *c=[[NSURLConnection alloc] initWithRequest:request delegate:fcd startImmediately:NO];
[c setDelegateQueue:[[NSOperationQueue alloc] init]];
[c start];
NSData *data=[fcd getData];

if (data)
    NSLog(@"Submit response data: %@", [NSString stringWithUTF8String:[data bytes]]);

Я не ищу, чтобы кто-то написал мой код для меня. Я просто не могу понять, как сопоставить детали AFNetworking-2. Любые ссылки, примеры или объяснения приветствуются.

ОБНОВЛЕНИЕ 1

Вышеупомянутая версия является версией без AF, которая, как известно, работает. Двигаясь, пытаясь получить все за один раз, я просто попробовал:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer
    setAuthorizationHeaderFieldWithUsername:@"app_pseudouser"
    password:@"sample_password"];
AFHTTPRequestOperation *operation =
[manager
    PUT: @"https://172.16.214.214:44321/twig_monikers"
    parameters: [self jsonDict]
    success:^(AFHTTPRequestOperation *operation, id responseObject){
        NSLog(@"Submit response data: %@", responseObject);}
    failure:^(AFHTTPRequestOperation *operation, NSError *error){
        NSLog(@"Error: %@", error);}
];

Что вызывает следующую ошибку:

2013-10-09 11:41:38.558 TwigTag[1403:60b] Error: Error Domain=NSURLErrorDomain Code=-1012 "The operation couldn’t be completed. (NSURLErrorDomain error -1012.)" UserInfo=0x1662c1e0 {NSErrorFailingURLKey=https://172.16.214.214:44321/twig_monikers, NSErrorFailingURLStringKey=https://172.16.214.214:44321/twig_monikers}

Наблюдая за сервером, ничего не происходит. Я не знаю, связано ли это с тем, что https, или что-то, но я могу перевернуть приложение обратно к исходному коду, и он проходит очень хорошо.

4b9b3361

Ответ 1

ОБНОВЛЕНИЕ: Было обнаружено, что часть JSON из следующего найдена для PUT/POST, но НЕ для GET/HEAD/DELETE

После некоторых пререканий и помощи вне СО, у меня есть что-то работающее, которое я хотел оставить в качестве памятного подарка. В конце концов, я был очень впечатлен AFNetworking-2. Это было так просто, я старался сделать это сложнее, чем следовало бы. Учитывая метод jsonDict, который возвращает отправленный json-пакет, я создал следующее:

- (void) submitAuthenticatedRest_PUT
{
    // it all starts with a manager
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    // in my case, I'm in prototype mode, I own the network being used currently,
    // so I can use a self generated cert key, and the following line allows me to use that
    manager.securityPolicy.allowInvalidCertificates = YES;
    // Make sure we a JSON serialization policy, not sure what the default is
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    // No matter the serializer, they all inherit a battery of header setting APIs
    // Here we do Basic Auth, never do this outside of HTTPS
    [manager.requestSerializer
        setAuthorizationHeaderFieldWithUsername:@"basic_auth_username"
        password:@"basic_auth_password"];
    // Now we can just PUT it to our target URL (note the https).
    // This will return immediately, when the transaction has finished,
    // one of either the success or failure blocks will fire
    [manager
        PUT: @"https://101.202.303.404:5555/rest/path"
        parameters: [self jsonDict]
        success:^(AFHTTPRequestOperation *operation, id responseObject){
            NSLog(@"Submit response data: %@", responseObject);} // success callback block
        failure:^(AFHTTPRequestOperation *operation, NSError *error){
            NSLog(@"Error: %@", error);} // failure callback block
    ];
}

3 инструкций по установке, за которыми следуют 2 сообщения, это действительно так просто.

EDIT/ADDED: Пример реализации @jsonDict:

- (NSMutableDictionary*) jsonDict
{
    NSMutableDictionary *result = [[NSMutableDictionary alloc] init];
    result[@"serial_id"] = self.serialID;
    result[@"latitude"] = [NSNumber numberWithDouble: self.location.latitude];
    result[@"longitude"] = [NSNumber numberWithDouble: self.location.longitude];
    result[@"name"] = self.name;
    if ([self hasPhoto])
    {
        result[@"photo-jpeg"] = [UIImageJPEGRepresentation(self.photo, 0.5)
            base64EncodedStringWithOptions: NSDataBase64Encoding76CharacterLineLength];
}
return result;

}

Он должен просто вернуть словарь со строковыми клавишами и простыми объектами в виде значений (NSNumber, NSString, NSArray (я думаю) и т.д.). Кодер JSON делает для вас все остальное.