2012-09-22 13 views
6

Il mio previous question riguardava il problema che dovevo accedere ogni volta per fare servizi web come pubblicare un link o caricare un'immagine. Philipe ha risposto che devo utilizzare i cookie al posto della procedura di accesso per ogni richiesta. Ho trovato questo metodo per ottenere i cookie:Come ottenere i cookie e usarli per altre richieste come POST (iOS)?

- (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); 
    } 
} 

ho trovato anche questo codice per utilizzare questi biscotti, ma non sono sicuro di come usarlo:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookies]; 

Ecco il mio metodo per la pubblicazione, sto usando RestKit API:

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

domanda: quale proprietà del cookie devo conservare di usarlo per le informazioni di login e dove dovrei mettere nel mio codice?

+0

Quindi nessuna soluzione ancora? –

+1

@FadyKamal Inserisco la mia metodologia, spero che sia utile per voi. – Hamid

risposta

1

Ho risolto questo problema in modo inefficiente. Ecco la mia metodologia: Per prima cosa provo a postare sul servizio web e dopo la pubblicazione analizzo il codice HTML restituito per vedere se il post ha avuto successo o meno. Se la pubblicazione ha esito positivo, fornisco all'utente un messaggio appropriato da pubblicare correttamente, ma se non ha avuto successo potrebbe avere due motivi: Primo: c'erano alcuni errori durante l'esecuzione del post. Secondo: l'utente non era loggato. Il modo in cui Riconosco che la differenziazione tra pugno e secondo errore sta solo analizzando la risposta HTML. Ecco il codice che ho usato per questa metodologia (questo è per il tempo che l'utente vuole cambiare la 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:@"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]; 
} 
Problemi correlati