2013-01-24 29 views
7

Próbuję wykonać proste żądanie POST z formularzem danych do api, ale zawsze otrzymuję status 401 w zamian.AFNetworking Post Formularz danych

Mogę z łatwością wykonać połączenie poza Xcode (na przykład w Postmanie) z powodzeniem, wszystko co robię to POST do adresu URL z parami klucz-wartość typu Form-Data, ale w kodzie xcode zawsze kończy się niepowodzeniem.

Oto moja AFHTTPClient:

@implementation UnpaktAPIClient 

+ (id)sharedInstance { 
    static UnpaktAPIClient *__sharedInstance; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     __sharedInstance = [[UnpaktAPIClient alloc] initWithBaseURL:[NSURL URLWithString:UnpaktAPIBaseURLString]]; 
    }); 
    return __sharedInstance; 
} 

- (id)initWithBaseURL:(NSURL *)url { 
    self = [super initWithBaseURL:url]; 
    if (self) { 
     [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; 
     [self setParameterEncoding:AFFormURLParameterEncoding]; 
    } 
    return self; 
} 

- (NSDictionary *)login:(NSDictionary *)credentials { 

    [[UnpaktAPIClient sharedInstance] postPath:@"/api/v1/users/login" 
            parameters:credentials 
             success:^(AFHTTPRequestOperation *operation, id response) { 
              NSLog(@"success"); 
             } 
             failure:^(AFHTTPRequestOperation *operation, NSError *error){ 
              NSLog(@"%@", error); 
             }]; 

    return nil; 
} 

Ja również próbę stworzenia prośbę z requestOperation:

- (NSDictionary *)login:(NSDictionary *)credentials { 

    NSMutableURLRequest *request = [[UnpaktAPIClient sharedInstance] requestWithMethod:@"POST" path:@"/api/v1/users/login" parameters:credentials]; 

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

    return nil; 
} 

Ale dostać dokładną sam błąd cały czas: Error Domain=AFNetworkingErrorDomain Code=-1011 "Expected status code in (200-299), got 401". Spodziewam się opinii JSON, możesz zobaczyć warunek sukcesu na załączonym obrazku. Podejrzewam, że jest to coś bardzo prostego, ale wyciągam włosy, próbując je znaleźć, jestem całkiem nowy w networkingu. Każda pomoc byłaby niesamowita, dziękuję. Postman Success

UPDATE

Ponieważ żądanie Listonosz ma puste params i nagłówki, pomyślałem, że muszę dostać się do ciała formularza. Zmiana żądania:

- (NSDictionary *)login:(NSDictionary *)credentials { 

    NSURLRequest *request = [self multipartFormRequestWithMethod:@"POST" 
                  path:@"/api/v1/users/login" 
                 parameters:nil 
             constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 

             }]; 
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
                         success:^(NSURLRequest *request, NSHTTPURLResponse *response, id json) { 
                          NSLog(@"success"); 
                         } 
                         failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id json) { 
                          NSLog(@"%@", error); 
                         }]; 
    [operation start]; 
    return nil; 
} 

Teraz daje mi błąd 404, czyli co by się spodziewać bez ważnego e-mail i hasło, po prostu trzeba dowiedzieć się, jak dodasz do korpusu formy, cokolwiek Próbuję dodać, gdy pojawia się błąd "zażądany strumień treści żądania".

+0

czy dodany protokół do adresu URL, przykład http: //? –

+0

Tak, adres URL błędu, który zostanie zgłoszony, jest prawidłowy, przed którym powinienem być uwierzytelniany. – hokiewalrus

+1

Może to być problem z podstawowym uwierzytelnianiem http. W przypadku podstawowego uwierzytelniania działa to dla mnie: NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: @ ""]]; // tmpBase 64 to base64 poświadczeń w formacie nazwa_użytkownika: hasło NSString * authValue = [NSString stringWithFormat: @ "Basic% @", tmpBase64]; [request setValue: authValue forHTTPHeaderField: @ "Authorization"]; –

Odpowiedz

8

Rozumiem, okazuje się, że to trochę rozwlekły dodawania par klucz/wartość do form-data, ale osiągnąłem go tak:

NSMutableData *email = [[NSMutableData alloc] init]; 
NSMutableData *password = [[NSMutableData alloc] init]; 
[email appendData:[[NSString stringWithFormat:@"[email protected]"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[password appendData:[[NSString stringWithFormat:@"qwerty"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[formData appendPartWithFormData:email name:@"email"]; 
[formData appendPartWithFormData:password name:@"password"]; 
Powiązane problemy