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ę.
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".
czy dodany protokół do adresu URL, przykład http: //? –
Tak, adres URL błędu, który zostanie zgłoszony, jest prawidłowy, przed którym powinienem być uwierzytelniany. – hokiewalrus
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"]; –