2012-07-02 4 views
18

EDIT 07/14AFNetworking - Как сделать запрос POST

Как Билл Берджесс упоминалось в комментарии своего ответа, этот вопрос связан с version 1.3 из AFNetworking. Это может быть устаревшим для новичков здесь.


Я совершенно новой для разработки iPhone, и я использую AFNetworking в моей библиотеке услуг.

API, который я запрашиваю, является RESTful, и мне нужно сделать POST-запросы. Чтобы сделать это, я попытался с помощью следующего кода:

NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:@"my_username", @"username", @"my_password", @"password", nil]; 
NSURL *url = [NSURL URLWithString:@"http://localhost:8080/login"]; 

NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
    NSLog(@"Pass Response = %@", JSON); 
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
    NSLog(@"Failed Response : %@", JSON); 
}]; 
[operation start]; 

Есть две основные проблемы с этим кодом:

  • AFJSONRequestOperation, кажется, делает GET запрос, а не POST один.
  • Я не могу поместить параметры в этот метод.

Я также попытался с этим кодом:

NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:@"my_username", @"username", @"my_password", @"password", nil]; 
NSURL *url = [NSURL URLWithString:@"http://localhost:8080"]; 
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; 

[httpClient postPath:@"/login" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"Succes : %@", responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Failure : %@", error); 
}]; 

Есть ли лучший способ сделать то, что я хочу здесь, чтобы сделать это?

Спасибо за помощь!

ответ

24

Вы можете переопределить поведение по умолчанию вашего запроса, используемого с AFNetworking, для обработки как POST.

NSURLRequest *request = [client requestWithMethod:@"POST" path:path parameters:nil]; 

Это предполагает, что вы переопределены настройки по умолчанию AFNetworking использовать пользовательский клиент. Если вы этого не сделаете, я бы предложил сделать это. Просто создайте настраиваемый класс для работы с вашим сетевым клиентом.

MyAPIClient.h

#import <Foundation/Foundation.h> 
#import "AFHTTPClient.h" 

@interface MyAPIClient : AFHTTPClient 

+(MyAPIClient *)sharedClient; 

@end 

MyAPIClient.m

@implementation MyAPIClient 

+(MyAPIClient *)sharedClient { 
    static MyAPIClient *_sharedClient = nil; 
    static dispatch_once_t oncePredicate; 
    dispatch_once(&oncePredicate, ^{ 
     _sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:webAddress]]; 
    }); 
    return _sharedClient; 
} 

-(id)initWithBaseURL:(NSURL *)url { 
    self = [super initWithBaseURL:url]; 
    if (!self) { 
     return nil; 
    } 
    [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; 
    [self setDefaultHeader:@"Accept" value:@"application/json"]; 
    self.parameterEncoding = AFJSONParameterEncoding; 

    return self; 

} 

Тогда вы должны быть в состоянии выстрелить сетевые вызовы на очереди операций без проблем.

MyAPIClient *client = [MyAPIClient sharedClient]; 
    [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]; 
    [[AFNetworkActivityIndicatorManager sharedManager] incrementActivityCount]; 

    NSString *path = [NSString stringWithFormat:@"myapipath/?value=%@", value]; 
    NSURLRequest *request = [client requestWithMethod:@"POST" path:path parameters:nil]; 

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
     // code for successful return goes here 
     [[AFNetworkActivityIndicatorManager sharedManager] decrementActivityCount]; 

     // do something with return data 
    }failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
     // code for failed request goes here 
     [[AFNetworkActivityIndicatorManager sharedManager] decrementActivityCount]; 

     // do something on failure 
    }]; 

    [operation start]; 
+0

Благодарим за ваш ответ! Только один вопрос: ваш 'SIOAPIClient' был бы« MyAPIClient »здесь нет? –

+0

Вы правы ... Я копировал/вставлял это из своей собственной реализации и менял имена классов. Наверное, я пропустил пятно. Я отредактировал свой ответ, как это должно быть. –

+0

Я пытался реализовать пользовательский клиент так же, как вы пишете, но я получаю сообщение об ошибке: 'Нет известного метода класса для selector 'sharedClient''. Заголовок включен правильно, поэтому мне интересно, почему я получаю эту ошибку. –

Смежные вопросы