2012-07-02 21 views
18

DÜZENLEME 07/14AFNetworking - Bill Burgess onun cevabını bir yorumda mentionned POST isteği

nasıl yapılır, bu soru AFNetworking ait version 1.3 ilişkilidir. Yeni gelenler için güncel olmayabilir.


iPhone gelişimine oldukça yeniyim ve benim hizmetler kitaplığı olarak AFNetworking kullanıyorum.

API i'm sorgulama RESTful olanı ve POST isteklerini yapmam gerekiyor. Bunu yapmak için, aşağıdaki kodu ile çalıştı:

  • AFJSONRequestOperation bir GET isteği değil, bir POST bir hale getirmek için görünüyor:

    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]; 
    

    bu kodla iki ana konu var.

  • Bu yönteme parametre koyamıyorum.

    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); 
    }]; 
    

    ben onu halletmek için buraya istediğini yapmak için daha iyi bir yolu var mı:

Ben de bu kodla çalıştı?

Yardımın için teşekkürler!

cevap

24

POST olarak işlemek için isteğinizin varsayılan davranışını AFNetworking ile kullanıldığında geçersiz kılabilirsiniz.

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

Bu özel bir istemci kullanmaya varsayılan AFNetworking kurulumunu geçersiz varsayılmaktadır. Eğer yapmazsan, bunu yapmanı öneririm. Ağ istemcinizi sizin için ele almak için özel bir sınıf oluşturun.

@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.h

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

@interface MyAPIClient : AFHTTPClient 

+(MyAPIClient *)sharedClient; 

@end 

MyAPIClient.m Sonra hiçbir sorun ile işlem sırasına ağ aramaları ateşlemesi gerekir.

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

Cevabınız için teşekkür ederiz! Sadece bir soru: “SIOAPIClient” iniz “MyAPIClient” olur mu? –

+0

Haklısın ... Bunu kendi uygulamamdan kopyaladım/yapıştırdım ve sınıf isimlerini değiştirdim. Sanırım bir nokta kaçırdım. Nasıl olması gerektiğine cevabımı düzenledim. –

+0

Yazdığınız gibi bir özel istemci uygulamayı denedim, ancak bir hata alıyorum: ''sharedClient' seçicisi için bilinen bir sınıf yöntemi yok. Üstbilgi doğru şekilde dahil edildi, bu yüzden neden bu hatayı alıyorum merak ediyorum. –