2012-07-02 16 views
18

EDIT 07/14AFNetworking - Wie POST-Anfrage

Als Bill Burgess erwähnt in einem Kommentar seiner Antwort zu machen, wird diese Frage an die version 1.3 von AFNetworking bezogen. Es kann für die Neuankömmlinge hier veraltet sein.


Ich bin ganz neu in iPhone Entwicklung, und ich bin mit AFNetworking als meine Dienste Bibliothek.

Die API, die ich abfrage, ist eine RESTful, und ich muss POST-Anfragen stellen. Um dies zu tun, habe ich versucht, mit dem folgenden Code:

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

Es gibt zwei Hauptprobleme mit diesem Code:

  • AFJSONRequestOperation scheinen einen GET Antrag zu stellen, keine POST ein.
  • Ich kann diese Methode nicht mit Parametern versehen.

Ich habe auch versucht mit diesem Code:

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

Gibt es eine bessere Art und Weise zu machen, was ich hier will getan, um es zu erhalten?

Danke für die Hilfe!

Antwort

24

Sie können das Standardverhalten Ihrer Anfrage mit AFNetworking überschreiben, um sie als POST zu verarbeiten.

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

Dies vorausgesetzt, dass Sie die Standard AFNetworking Setup überschrieben haben einen benutzerdefinierten Client zu verwenden. Wenn Sie nicht sind, würde ich vorschlagen, es zu tun. Erstellen Sie einfach eine benutzerdefinierte Klasse, um Ihren Netzwerk-Client für Sie zu verwalten.

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; 

} 

Dann sollten Sie in der Lage sein, Ihr Netzwerk fordert die Operations-Warteschlange ohne Probleme abzufeuern.

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

Vielen Dank für Ihre Antwort! Nur eine Frage: Dein 'SIOAPIClient' wäre ein' MyAPIClient' hier nicht? –

+0

Sie haben Recht ... Ich habe das aus meiner eigenen Implementierung kopiert und eingefügt und die Klassennamen geändert. Verpasste eine Stelle, denke ich. Ich habe meine Antwort so bearbeitet, wie es sein sollte. –

+0

Ich habe versucht, einen benutzerdefinierten Client so zu implementieren, wie Sie schreiben, aber ich bekomme einen Fehler: 'Keine bekannte Klassenmethode für den Selektor 'sharedClient''. Der Header ist korrekt enthalten, also frage ich mich, warum ich diesen Fehler bekomme. –