AFNetworking POST to REST веб-сервис - PullRequest
8 голосов
/ 29 марта 2012

Краткая предыстория, наш предыдущий разработчик использовал ASIHTTPRequest для выполнения запросов POST и получения данных из нашего веб-сервиса.По неизвестным причинам эта часть нашего приложения перестала работать.Выглядело как достаточно хорошее время для будущего и использования AFNetworking.Веб-сервис REST работает на платформе CakePHP.

Короче говоря, я не получаю строку ответа на запрос с использованием AFNetworking.

Я знаю, что веб-сервис работает, потому что я могу успешно разместить данные и получить правильный ответ, используя curl: curl -d "data [Model] [field0] = field0value & data [Model] [field1] = field1value" https://example.com/api/class/function.plist

В соответствии с инструкциями предыдущего разработчика я придумал следующее.

#import "AFHTTPRequestOperation.h"    

…

- (IBAction)loginButtonPressed {

    NSURL *url = [NSURL URLWithString:@"https://example.com/api/class/function.plist"];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request setHTTPMethod:@"POST"];

    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

    [request setValue:[usernameTextField text] forHTTPHeaderField:@"data[User][email]"];

    [request setValue:[passwordTextField text] forHTTPHeaderField:@"data[User][password]"];

    AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {  

        NSLog(@"operation hasAcceptableStatusCode: %d", [operation.response statusCode]);

        NSLog(@"response string: %@ ", operation.responseString);

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        NSLog(@"error: %@", operation.responseString);

    }];

    [operation start];

}

output: operation hasAcceptableStatusCode: 200 строка ответа: пустой файл plist

попытка решения 1: AFNetworking Post Request предлагаемое решение использует функцию AFHTTPRequestOperation, которая называетсяoperationWithRequest.Однако, когда я пытаюсь использовать указанное решение, я получаю предупреждение «Метод класса» + operationWithRequest: завершение: «не найдено (тип возвращаемого значения по умолчанию равен« id »)

попытка решения 2: NSURLConnection. Output: I 'я могу напечатать сообщение об успешном журнале, но не строку ответа. * update - возвращает пустой список.

NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
NSString *httpBodyData = @"data[User][email]=username@example.com&data[User][password]=awesomepassword";
[httpBodyData dataUsingEncoding:NSUTF8StringEncoding];
[req setHTTPMethod:@"POST"];
[req setHTTPBody:[NSData dataWithContentsOfFile:httpBodyData]];
NSHTTPURLResponse __autoreleasing *response;
NSError __autoreleasing *error;
[NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&error];

// *update - returns blank plist
NSData *responseData = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil];
NSString *str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSLog(@"responseData %@",str);

if (error == nil && response.statusCode == 200) {
    // Process response
    NSLog(@"success");//returns success code of 200 but blank
    NSLog(@"resp %@", response );
} else {
    // Process error
    NSLog(@"error");
}

Ответы [ 2 ]

18 голосов
/ 04 апреля 2012

Это основные (исключающие условия, которые я создал для себя) строки, которые в итоге удовлетворили мой запрос к веб-сервису. Спасибо за предложения @ 8vius и @mattt!

- (IBAction)loginButtonPressed {        
    NSURL *baseURL = [NSURL URLWithString:@"https://www.example.com/api/class"];

    //build normal NSMutableURLRequest objects
    //make sure to setHTTPMethod to "POST". 
    //from https://github.com/AFNetworking/AFNetworking
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
    [httpClient defaultValueForHeader:@"Accept"];

    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                            [usernameTextField text], kUsernameField, 
                            [passwordTextField text], kPasswordField, 
                            nil];

    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" 
          path:@"https://www.example.com/api/class/function" parameters:params];

    //Add your request object to an AFHTTPRequestOperation
    AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] 
                                      initWithRequest:request] autorelease];

    //"Why don't I get JSON / XML / Property List in my HTTP client callbacks?"
    //see: https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ
    //mattt's suggestion http://stackoverflow.com/a/9931815/1004227 -
    //-still didn't prevent me from receiving plist data
    //[httpClient registerHTTPOperationClass:
    //         [AFPropertyListParameterEncoding class]];

    [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];

    [operation setCompletionBlockWithSuccess:
      ^(AFHTTPRequestOperation *operation, 
      id responseObject) {
        NSString *response = [operation responseString];
        NSLog(@"response: [%@]",response);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"error: %@", [operation error]);
    }];

    //call start on your request operation
    [operation start];
    [httpClient release];
}
6 голосов
/ 29 марта 2012

Используйте AFHTTPClient -postPath:parameters:success:failure:, передавая ваши параметры (вложенные словари / массивы в порядке). Если вы ожидаете возвращения списка, убедитесь, что клиент зарегистрировался AFPropertyListRequestOperation.

В любом случае, setValue:forHTTPHeaderField: не то, что вы хотите здесь. HTTP-заголовки предназначены для указания информации о самом запросе; Данные являются частью тела запроса. AFHTTPClient автоматически преобразует параметры либо в строку запроса для GET запросов, либо в тело HTTP для POST, и др.

...