2012-09-22 9 views
6

Benim previous question Benim bir bağlantı gönderme veya resim yükleme gibi web hizmetleri yapmak için her zaman giriş yapmak zorunda sorun hakkındaydı. Philipe, her istek için giriş işlemi yerine çerez kullanmam gerektiğini söyledi. ,Çerezler nasıl alınır ve POST (iOS) gibi diğer istekler için kullanılabilir?

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookies]; 

İşte yazabilmek için benim yöntemdir: Ben de bu çerezleri kullanmak için bu kodu bulundu

- (void)getCookies { 

    NSHTTPURLResponse * response; 
    NSError * error; 
    NSMutableURLRequest *request; 

    request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://MyWebsite.com/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:@"http://MyWebsite.com/login.php"]]; 
    NSLog(@"%d", all.count); 

    for (NSHTTPCookie *cookie in all) { 
     NSLog(@"Name: %@ : Value: %@", cookie.name, cookie.value); 
     NSLog(@"Comment: %@ : CommentURL: %@", cookie.comment, cookie.commentURL); 
     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); 
    } 
} 

ama nasıl kullanılacağını emin değilim: Ben almak çerezler için bu yöntemi bulundu Ben RestKit API kullanıyorum:

- (IBAction)addLinkPressed:(UIButton *)sender { 

     [RKClient clientWithBaseURLString:@"http://MyWebsite.com"]; 

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

Soru: giriş bilgileri için kullanmak saklamalısınız ve nerede benim kodunda o koymalıyız çerez mülkiyet?

+0

hiçbir çözüm henüz (Bu kullanıcının şifresini değiştirmek istediği zaman içindir)? –

+1

@FadyKamal Metodolojimi gönderiyorum, umarım size yardımcı olur. – Hamid

cevap

1

Bu sorunu biraz verimsiz bir şekilde çözdüm. İşte benim metodolojim: İlk önce web servisine göndermeyi deniyorum ve gönderdikten sonra gönderimin başarılı olup olmadığını görmek için dönen HTML'yi ayrıştırıyorum. Gönderme başarılı olduysa, kullanıcıya başarıyla gönderdiğiniz uygun bir mesaj veriyorum ancak başarılı olmazsa iki nedeni olabilir: Birincisi: post icra sırasında bazı hatalar vardı. İkinci: kullanıcı giriş yapmadı. Yumruk ve ikinci hata arasındaki farkın sadece yanıt HTML'sini ayrıştırdığını biliyorum. İşte bu metodoloji için kullanılan koddur Yani

- (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:@"http://WebServiceDomain.com"]; 

    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:@"http://WebServiceDomain.com"]; 
    [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]; 
} 
İlgili konular