AFNetworking Post Запрос
Я новичок в obj-c и использую asihttp для некоторых из моих проектов. При выполнении запроса post в asihttp его сделали таким образом.
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:height forKey:@"user[height]"];
[request setPostValue:weight forKey:@"user[weight]"];
[request setDelegate:self];
[request startAsynchronous];
Как бы это сделать, это AFNetworking с примером кода ?
Я уже получил get Json getrequest, работающий в AFNetworking, но этот запрос post дает мне некоторые проблемы. Заранее спасибо за помощь.
14 ответов:
сначала стоит добавить (так как этот ответ все еще популярен через 6 лет после того, как я его написал...) что первое, что вы должны рассмотреть, это следует ли вам даже использовать AFNetworking. NSURLSession был добавлен в iOS 7 и означает, что вам не нужно использовать AFNetworking во многих случаях - и одна сторонняя библиотека всегда хороша.
Для AFNetworking 3.0:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; NSDictionary *params = @{@"user[height]": height, @"user[weight]": weight}; [manager POST:@"https://example.com/myobject" parameters:params progress:nil success:^(NSURLSessionTask *task, id responseObject) { NSLog(@"JSON: %@", responseObject); } failure:^(NSURLSessionTask *operation, NSError *error) { NSLog(@"Error: %@", error); }];
для AFNetworking 2.0 (а также с помощью нового NSDictionary синтаксис):
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; NSDictionary *params = @{@"user[height]": height, @"user[weight]": weight}; [manager POST:@"https://example.com/myobject" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }];
Если вы застряли с помощью AFNetworking 1.0, вам нужно сделать это следующим образом:
NSURL *url = [NSURL URLWithString:@"https://example.com/"]; AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: height, @"user[height]", weight, @"user[weight]", nil]; [httpClient postPath:@"/myobject" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { NSString *responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"Request Successful, response '%@'", responseStr); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"[HTTPClient Error]: %@", error.localizedDescription); }];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: height, @"user[height]", weight, @"user[weight]", nil]; AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL: [NSURL URLWithString:@"http://localhost:8080/"]]; [client postPath:@"/mypage.php" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { NSString *text = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"Response: %@", text); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", [error localizedDescription]); }];
вот простой AFNetworking сообщение, которое я использую. Чтобы встать и бежать за ним читая AFNetworking doc, wkiki, ref и т. д., Я многому научился после http://nsscreencast.com/episodes/6-afnetworking и понимание связанный пример кода на github.
// Add this to the class you're working with - (id)init {} _netInst = [MyApiClient sharedAFNetworkInstance]; // build the dictionary that AFNetworkng converts to a json object on the next line // params = {"user":{"email":emailAddress,"password":password}}; NSDictionary *parameters =[NSDictionary dictionaryWithObjectsAndKeys: userName, @"email", password, @"password", nil]; NSDictionary *params =[NSDictionary dictionaryWithObjectsAndKeys: parameters, @"user", nil]; [_netInst postPath: @"users/login.json" parameters:params success:^(AFHTTPRequestOperation *operation, id jsonResponse) { NSLog (@"SUCCESS"); // jsonResponse = {"user":{"accessId":1234,"securityKey":"abc123"}}; _accessId = [jsonResponse valueForKeyPath:@"user.accessid"]; _securityKey = [jsonResponse valueForKeyPath:@"user.securitykey"]; return SUCCESS; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"FAILED"); // handle failure return error; } ];
AFHTTPClient * Client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://urlname"]]; NSDictionary * parameters = [[NSMutableDictionary alloc] init]; parameters = [NSDictionary dictionaryWithObjectsAndKeys: height, @"user[height]", weight, @"user[weight]", nil]; [Client setParameterEncoding:AFJSONParameterEncoding]; [Client postPath:@"users/login.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"operation hasAcceptableStatusCode: %d", [operation.response statusCode]); NSLog(@"response string: %@ ", operation.responseString); NSDictionary *jsonResponseDict = [operation.responseString JSONValue]; if ([[jsonResponseDict objectForKey:@"responseBody"] isKindOfClass:[NSMutableDictionary class]]) { NSMutableDictionary *responseBody = [jsonResponseDict objectForKey:@"responseBody"]; //get the response here } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error: %@", operation.responseString); NSLog(@"%d",operation.response.statusCode); }];
надеюсь, что это работает.
[SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeGradient]; [SVProgressHUD show]; NSDictionary *dictParam =@{@"user_id":@"31"};// Add perameter NSString *URLString =@"your url string"; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager setResponseSerializer:[AFHTTPResponseSerializer serializer]]; [manager.requestSerializer setValue:strGlobalLoginToken forHTTPHeaderField:@"Authorization"];//strGlobalLoginToken is your login token // [manager.requestSerializer setValue:setHeaderEnv forHTTPHeaderField:@"Env"]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain",@"application/rss+xml", nil]; [manager POST:URLString parameters:dictParam progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil]; NSLog(@"Response DICT:%@",response); if ([[[[response objectForKey:@"response"] objectAtIndex:0] objectForKey:@"status"] isEqualToString:@"true"]) { for (NSMutableDictionary *dicAll in [[[response objectForKey:@"response"]objectAtIndex:0]objectForKey:@"plans"]) { [yourNsmutableArray addObject:[dicAll mutableCopy]]; } //yourNsmutableArray Nsmutablearray alloction in view didload NSLog(@"yourNsmutableArray %@",yourNsmutableArray); } else { NSLog(@"False"); } [SVProgressHUD dismiss]; } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) { NSLog(@"RESPONSE STRING:%@",task.response); NSLog(@"error userInfo:%@",error.userInfo); NSString *errResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding]; NSLog(@"URLString :--->> %@ Error********* %@",URLString,errResponse); [SVProgressHUD dismiss]; }];
для AFNetworking 3.0 и Swift. Может быть, мы можем использовать так:
let configutation = NSURLSessionConfiguration.defaultSessionConfiguration() manager = AFHTTPSessionManager(sessionConfiguration: configutation) let urlString = "url" manager.POST(urlString, parameters: [params here], progress: nil, success: { (dataTask: NSURLSessionDataTask, response: AnyObject?) -> Void in print(dataTask) print(response) }) { (dataTask: NSURLSessionDataTask?, error: NSError) -> Void in print(error) }
надеюсь, что это поможет другим найти ответ, как я!
Для AFNetworking 3.0 (iOS9 или greter)
NSString *strURL = @"https://exampleWeb.com/webserviceOBJ"; NSDictionary *dictParamiters = @{@"user[height]": height,@"user[weight]": weight}; NSString *aStrParams = [self getFormDataStringWithDictParams:dictParamiters]; NSData *aData = [aStrParams dataUsingEncoding:NSUTF8StringEncoding]; NSMutableURLRequest *aRequest = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:strURL]]; [aRequest setHTTPMethod:@"POST"]; [aRequest setHTTPBody:aData]; NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:nil delegateQueue:nil]; [aRequest setHTTPBody:aData]; NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:aRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // if (error ==nil) { NSString *aStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"ResponseString:%@",aStr); NSMutableDictionary *aMutDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; dispatch_async(dispatch_get_main_queue(), ^{ completionBlock(aMutDict); NSLog(@"responce:%@",aMutDict) }); } else { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"error:%@",error.locali) }); } }]; [postDataTask resume];
и добавить
-(NSString *)getFormDataStringWithDictParams:(NSDictionary *)aDict { NSMutableString *aMutStr = [[NSMutableString alloc]initWithString:@""]; for (NSString *aKey in aDict.allKeys) { [aMutStr appendFormat:@"%@=%@&",aKey,aDict[aKey]]; } NSString *aStrParam; if (aMutStr.length>2) { aStrParam = [aMutStr substringWithRange:NSMakeRange(0, aMutStr.length-1)]; } else aStrParam = @""; return aStrParam; }
NSURL *URL = [NSURL URLWithString:@"url"]; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; NSDictionary *params = @{@"prefix":@"param",@"prefix":@"param",@"prefix":@"param"}; [manager POST:URL.absoluteString parameters:params progress:nil success:^(NSURLSessionTask *task, id responseObject) { self.arrayFromPost = [responseObject objectForKey:@"data"]; // values in foreach loop NSLog(@"POst send: %@",_arrayFromPost); } failure:^(NSURLSessionTask *operation, NSError *error) { NSLog(@"Error: %@", error); }];
NSMutableDictionary *dictParam = [NSMutableDictionary dictionary]; [dictParam setValue:@"VALUE_NAME" forKey:@"KEY_NAME"]; //set parameters like id, name, date, product_name etc if ([[AppDelegate instance] checkInternetConnection]) { NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictParam options:NSJSONWritingPrettyPrinted error:&error]; if (jsonData) { NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"Api Url"] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0f]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:jsonData]; [request setValue:ACCESS_TOKEN forHTTPHeaderField:@"TOKEN"]; AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; op.responseSerializer = [AFJSONResponseSerializer serializer]; op.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain",@"text/html",@"application/json", nil]; [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { arrayList = [responseObject valueForKey:@"data"]; [_tblView reloadData]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { //show failure alert }]; [op start]; } } else { [UIAlertView infoAlertWithMessage:NO_INTERNET_AVAIL andTitle:APP_NAME]; }
вот пример Swift 3.0
let manager = AFHTTPSessionManager(sessionConfiguration: URLSessionConfiguration.default) manager.requestSerializer = AFJSONRequestSerializer() manager.requestSerializer.setValue("application/json", forHTTPHeaderField: "Content-Type") manager.requestSerializer.setValue("application/json", forHTTPHeaderField: "Accept") if authenticated { if let user = UserDAO.currentUser() { manager.requestSerializer.setValue("Authorization", forHTTPHeaderField: user.headerForAuthentication()) } } manager.post(url, parameters: parameters, progress: nil, success: { (task: URLSessionDataTask, responseObject: Any?) in if var jsonResponse = responseObject as? [String: AnyObject] { // here read response } }) { (task: URLSessionDataTask?, error: Error) in print("POST fails with error \(error)") }
please try below answer. +(void)callAFWSPost:(NSDictionary *)dict withURL:(NSString *)strUrl withBlock:(dictionary)block { AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; [manager.requestSerializer setValue:@"application/x-www-form-urlencoded; charset=UTF-8" forHTTPHeaderField:@"Content-Type"]; manager.requestSerializer = [AFHTTPRequestSerializer serializer]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil]; [manager POST:[NSString stringWithFormat:@"%@/%@",WebserviceUrl,strUrl] parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (!responseObject) { NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setObject:ServerResponceError forKey:@"error"]; block(responseObject); return ; } else if ([responseObject isKindOfClass:[NSDictionary class]]) { block(responseObject); return ; } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setObject:ServerResponceError forKey:@"error"]; block(dict); }]; }
для экрана входа в систему;
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:_usernametf.text, @"username",_passwordtf.text, @"password", nil]; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.requestSerializer = [AFHTTPRequestSerializer serializer]; [manager POST:@"enter your url" parameters:dict progress:nil success:^(NSURLSessionTask *task, id responseObject) { NSLog(@"%@", responseObject); } failure:^(NSURLSessionTask *operation, NSError *error) { NSLog(@"Error: %@", error); }];
}
// For Image with parameter /// AFMultipartFormData NSDictionary *dictParam =@{@"user_id":strGlobalUserId,@"name":[dictParameter objectForKey:@"Name"],@"contact":[dictParameter objectForKey:@"Contact Number"]}; AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:webServiceUrl]]; [manager.requestSerializer setValue:strGlobalLoginToken forHTTPHeaderField:@"Authorization"]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain",@"application/rss+xml", nil]; [manager POST:@"update_profile" parameters:dictParam constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { if (Imagedata.length>0) { [formData appendPartWithFileData:Imagedata name:@"profile_pic" fileName:@"photo.jpg" mimeType:@"image/jpeg"]; } } progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"update_profile %@", responseObject); if ([[[[responseObject objectForKey:@"response"] objectAtIndex:0] objectForKey:@"status"] isEqualToString:@"true"]) { [self presentViewController:[global SimpleAlertviewcontroller:@"" Body:[[[responseObject objectForKey:@"response"] objectAtIndex:0] objectForKey:@"response_msg"] handler:^(UIAlertAction *action) { [self.navigationController popViewControllerAnimated:YES]; }] animated:YES completion:nil]; } else { [self presentViewController:[global SimpleAlertviewcontroller:@"" Body:[[[responseObject objectForKey:@"response"] objectAtIndex:0] objectForKey:@"response_msg"] handler:^(UIAlertAction *action) { }] animated:YES completion:nil]; } [SVProgressHUD dismiss]; } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) { [SVProgressHUD dismiss]; }];
используя AFNetworking 3.0, вы должны написать:
NSString *strURL = @"https://exampleWeb.com/webserviceOBJ"; NSURL * urlStr = [NSURL URLWithString:strURL]; NSDictionary *dictParameters = @{@"user[height]": height,@"user[weight]": weight}; AFHTTPSessionManager * manager = [AFHTTPSessionManager manager]; [manager GET:url.absoluteString parameters:dictParameters success:^(NSURLSessionTask *task, id responseObject) { NSLog(@"PLIST: %@", responseObject); } failure:^(NSURLSessionTask *operation, NSError *error) { NSLog(@"Error: %@", error); }];