2012-09-22 12 views
6

Mi previous question fue sobre el problema que tengo que iniciar sesión cada vez para hacer servicios web, como publicar un enlace o subir una imagen. Philipe respondió que tengo que usar las cookies en lugar del proceso de inicio de sesión para cada solicitud. He encontrado este método para conseguir las cookies:¿Cómo obtener cookies y usarlas para otras solicitudes como 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); 
    } 
} 

También encontré este código para utilizar estas cookies, pero no estoy seguro de cómo usarlo:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookies]; 

Aquí es mi método de publicación de anuncios, estoy utilizando la API RestKit:

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

pregunta: ¿Qué propiedad de cookies debo guardar para usarlo para obtener información de inicio de sesión y dónde debo poner en mi código?

+0

Así que no hay soluciones todavía? –

+1

@FadyKamal Publiqué mi metodología, espero que sea útil para usted. – Hamid

Respuesta

1

He resuelto este problema de una manera ineficiente. Aquí está mi metodología: Primero intento publicar en el servicio web y después de publicar, analizo el código HTML para ver si la publicación fue exitosa o no. Si la publicación fue exitosa, le doy un mensaje al usuario que publique con éxito, pero si no fue exitoso podría tener dos motivos: Primero: hubo algún error durante la ejecución. Segundo: el usuario no había iniciado sesión. La forma en que Reconozco que la diferenciación entre puño y segundo error es solo analizar el HTML de respuesta. Aquí está el código que he usado para esta metodología (esto es, por el momento que el usuario desea cambiar la contraseña)

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