2012-09-22 7 views
6

私のprevious questionは、リンクの投稿や写真のアップロードなどのWebサービスを実行するたびにログインする必要があるという問題に関するものでした。 Philipeは、リクエストごとにログインプロセスの代わりにCookieを使用する必要があると答えました。私はクッキーを取得するため、この方法を見つけました:Cookieを取得して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); 
    } 
} 

私はまた、このコードはこれらのクッキーを使用することを見つけましたが、私はそれを使用するかどうかはわかりません。ここで

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookies]; 

は、投稿するための私の方法であり、私は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"]; 
} 

質問:クッキーのプロパティは、私がログイン情報とどこ私は私のコードでそれを置く必要があるためにそれを使用するために保存する必要がありましたか?

+0

なしのソリューションを、まだ(これは、ユーザーがパスワードを変更したい時のためですか)? –

+1

@FadyKamal私は方法論を投稿します、それはあなたにとって有益だと思います。 – Hamid

答えて

1

私はいくつかの非効率的な方法でこの問題を解決しました。私の方法論は次のとおりです。 まず、Webサービスに投稿しようとします。投稿後、返信したHTMLを解析して、投稿が成功したかどうかを確認します。投稿が成功した場合は、あなたが正常に投稿したユーザーに適切なメッセージを伝えますが、成功しなかった場合は次の2つの理由が考えられます。最初:投稿後にエラーが発生しました。私は第1のエラーと第2のエラーの区別は、応答HTMLを解析していることを認識しています。 ここで私はこの方法に使用されるコードがあるので、

- (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]; 
} 
関連する問題