如何获取Cookie并将其用于其他请求(如POST(iOS))?

编程入门 行业动态 更新时间:2024-10-23 14:32:43
本文介绍了如何获取Cookie并将其用于其他请求(如POST(iOS))?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我的上一个问题原为关于我每次登录每次进行web服务,如发布链接或上传图片的问题。菲利普回答说,我必须使用cookie而不是登录过程为每个请求。我发现这个方法获取cookie:

My previous question was about the problem that I have to login each time for doing web services like posting a link or uploading a picture. Philipe answered that I have to use cookies instead of login process for each request. I found this method for getting cookies:

- (void)getCookies { NSHTTPURLResponse * response; NSError * error; NSMutableURLRequest *request; request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"MyWebsite/login.php"] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:120]; NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]); NSArray * all = [NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:[NSURL URLWithString:@"MyWebsite/login.php"]]; NSLog(@"%d", all.count); for (NSHTTPCookie *cookie in all) { NSLog(@"Name: %@ : Value: %@", cookie.name, cookie.value); NSLog(@"Comment: %@ : CommentURL: %@", cookiement, cookiementURL); NSLog(@"Domain: %@ : ExpiresDate: %@", cookie.domain, cookie.expiresDate); NSLog(@"isHTTPOnly: %c : isSecure: %c", cookie.isHTTPOnly, cookie.isSecure); NSLog(@"isSessionOnly: %c : path: %@", cookie.isSessionOnly, cookie.path); NSLog(@"portList: %@ : properties: %@", cookie.portList, cookie.properties); NSLog(@"version: %u", cookie.version); } }

我也发现这个代码使用这些cookie,我不知道如何使用它:

I also found this code to use these cookies, but I'm not sure how to use it:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookies];

这是我的POST方法,我使用RestKit API:

Here is my method for POSTing, I am using RestKit API:

- (IBAction)addLinkPressed:(UIButton *)sender { [RKClient clientWithBaseURLString:@"MyWebsite"]; NSDictionary* params = [NSDictionary dictionaryWithObjectsAndKeys: self.linkField.text, @"url", self.linkTitleField.text, @"title", self.linkSummaryField.text, @"summary", nil]; RKRequest *request = [[RKClient sharedClient] post:@"/send_link.php" params:params delegate:self]; [request setUserData:@"sendLink"]; }

问题:要使用它的登录信息,我应该把它放在我的代码?

Question: Which property of cookies should I store to use it for login information and where should I put it in my code?

推荐答案

我通过一些低效的方式解决了这个问题。这里是我的方法:首先,我尝试发布到Web服务,发布后,我解析返回的HTML,看看发布是否成功。如果发布成功,我给用户发送一个适当的消息,你成功发布,但如果它不成功,它可能有两个原因:第一:在执行后有一些错误第二:用户没有登录。我认识到第一和第二个错误之间的区别只是解析响应HTML。 这是我用于这种方法的代码(这是用户想要更改密码的时间)

I solved this issue by some inefficient way. Here is my methodology: First I try to post to the web service and after posting I parse the returning HTML to see if the posting was successful or not. If posting was successful I give an appropriate message to the user that you post successfully but if it was not successful it could have two reasons: First: there were some error during the post execution Second: the user was not logged in. The way that I recognize the differentiation between fist and second error is just parsing the response HTML. Here is the code that I used for this methodology (this is for the time that the user wants to change the password)

- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error { NSRange range = [[error localizedDescription] rangeOfString:@"-1012"]; if (range.length > 0){ //First error occurs here } RKLogError(@"Hit error: %@", error); } - (IBAction)requestToChangePasswordPressed { MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; hud.labelText = @"Loading"; [RKClient clientWithBaseURLString:@"WebServiceDomain"]; NSDictionary* params = [NSDictionary dictionaryWithObjectsAndKeys: self.oldPasswordField.text, @"oldPassword", self.passwordNew.text, @"newPassword", self.confirmPasswordField.text, @"confirmPassword", nil]; RKRequest *request = [[RKClient sharedClient] post:@"/change_password.php" params:params delegate:self]; [request setUserData:@"changePassword"]; [self.view endEditing:YES]; [MBProgressHUD hideHUDForView:self.view animated:YES]; } - (void)autoLogin { [RKClient clientWithBaseURLString:@"WebServiceDomain"]; [RKObjectManager sharedManager].client=[RKClient sharedClient]; RKParams *parameters = [RKParams params]; [parameters setValue:[[NSUserDefaults standardUserDefaults] objectForKey:@"defaultUsername"] forParam:@"username"]; [parameters setValue:[[NSUserDefaults standardUserDefaults] objectForKey:@"defaultPassword"] forParam:@"password"]; [[RKClient sharedClient] setAuthenticationType:RKRequestAuthenticationTypeHTTP]; // because we have two POSTs and we want to use the same method for both of the for didLoadResponse: we set the UserDate like bellow RKRequest *request = [[RKClient sharedClient] post:@"/login.php" params:parameters delegate:self]; [request setUserData:@"login"]; } - (void)request:(RKRequest*)request didLoadResponse:(RKResponse*)response { MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; hud.labelText = @"Loading"; id userData = [request userData]; if ([userData isEqual:@"login"]) { if ([request isGET]) { // Handling GET /foo.xml if ([response isOK]) { // Success! Let's take a look at the data NSLog(@"Retrieved XML: %@", [response bodyAsString]); } } else if ([request isPOST]) { // Handling POST /other.json if ([response isJSON]) { NSLog(@"Got a JSON response back from our POST!"); } } else if ([request isDELETE]) { // Handling DELETE /missing_resource.txt if ([response isNotFound]) { NSLog(@"The resource path '%@' was not found.", [request resourcePath]); } } } else if ([userData isEqual:@"sendLink"]) { NSData *addLinksHtmlData = response.body; // 2 TFHpple *addlinksParser = [TFHpple hppleWithHTMLData:addLinksHtmlData]; // 3 NSString *errorLinksXpathQueryString = @"//div[@class='errorBox']/ul/li"; NSArray *errorLinksNodes = [addlinksParser searchWithXPathQuery:errorLinksXpathQueryString]; // 4 NSMutableArray *newErrorLinks = [[NSMutableArray alloc] initWithCapacity:0]; for (TFHppleElement *element in errorLinksNodes) { // 5 AllModels *errorTitle = [[AllModels alloc] init]; [newErrorLinks addObject:errorTitle]; // 6 errorTitle.errorTitle = [[element firstChild] content]; } // 8 self.linkErrorObjects = newErrorLinks; NSString *successLinksXpathQueryString = @"//div[@class='successBox']"; NSArray *successLinksNodes = [addlinksParser searchWithXPathQuery:successLinksXpathQueryString]; // 4 NSMutableArray *newSuccessLinks = [[NSMutableArray alloc] initWithCapacity:0]; for (TFHppleElement *element in successLinksNodes) { // 5 AllModels *successTitle = [[AllModels alloc] init]; [newSuccessLinks addObject:successTitle]; // 6 successTitle.successTitle = [[element firstChild] content]; } // 8 self.linkSuccessObjects = newSuccessLinks; } else { NSLog(@"HTTP status code: %d", response.statusCode); NSLog(@"HTTP status message: %@", [response localizedStatusCodeString]); NSLog(@"Header fields: %@", response.allHeaderFields); NSLog(@"Body: %@", response.bodyAsString); NSData *HtmlData = response.body; // 2 TFHpple *addParser = [TFHpple hppleWithHTMLData:HtmlData]; // 3 NSString *errorXpathQueryString = @"//div[@class='errorBox']/ul/li"; NSArray *errorNodes = [addParser searchWithXPathQuery:errorXpathQueryString]; // 4 NSMutableArray *newError = [[NSMutableArray alloc] initWithCapacity:0]; for (TFHppleElement *element in errorNodes) { // 5 AllModels *errorTitle = [[AllModels alloc] init]; [newError addObject:errorTitle]; // 6 errorTitle.errorTitle = [[element firstChild] content]; } // 8 self.ErrorObjects = newError; NSString *successXpathQueryString = @"//div[@class='successBox']"; NSArray *successNodes = [addParser searchWithXPathQuery:successXpathQueryString]; // 4 NSMutableArray *newSuccess = [[NSMutableArray alloc] initWithCapacity:0]; for (TFHppleElement *element in successNodes) { // 5 AllModels *successTitle = [[AllModels alloc] init]; [newSuccess addObject:successTitle]; // 6 successTitle.successTitle = [[element firstChild] content]; } // 8 self.successObjects = newSuccess; [self errorCheck]; } [MBProgressHUD hideHUDForView:self.view animated:YES]; [MBProgressHUD hideHUDForView:self.view animated:YES]; } - (void)errorCheck { MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; hud.labelText = @"Loading"; if(self.errorObjects.count > 0) { AllModels *errorlink = [self.errorObjects objectAtIndex:0]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"There is a problem" message:errorlink.errorTitle delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil , nil]; [alert show]; } else { if(self.linkErrorObjects.count > 0) { [self autoLogin]; [self requestToChangePasswordPressed]; } else { AllModels *successlink = [self.successObjects objectAtIndex:0]; self.successLabel.hidden = NO; self.successLabel.text = successlink.successTitle; NSLog(@"Success Title: %@",successlink.successTitle); [UIView animateWithDuration:3.0 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ self.successLabel.alpha = 0.0; } completion:^(BOOL fin) { if (fin) [self.successLabel removeFromSuperview]; }]; [self performSelector:@selector(dismissModalViewController) withObject:nil afterDelay:1.0]; } } [MBProgressHUD hideHUDForView:self.view animated:YES]; [MBProgressHUD hideHUDForView:self.view animated:YES]; }

更多推荐

如何获取Cookie并将其用于其他请求(如POST(iOS))?

本文发布于:2023-10-11 23:22:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1483127.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:并将其   Cookie   iOS   POST

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!