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

2024-02-03

My 上一个问题 https://stackoverflow.com/questions/12538782/how-to-remain-logged-in-until-user-decides-to-logout/是关于我每次都必须登录才能执行网络服务(例如发布链接或上传图片)的问题。 Philipe 回答说我必须使用 cookie 而不是每个请求的登录过程。我找到了获取cookies的方法:

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

我还找到了使用这些 cookie 的代码,但我不知道如何使用它:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookies];

这是我的 POST 方法,我使用 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"];   
}

问题:我应该存储 cookie 的哪些属性以将其用于登录信息以及我应该将其放在代码中的什么位置?


我通过一些低效的方式解决了这个问题。这是我的方法: 首先,我尝试发布到网络服务,发布后我解析返回的 HTML 以查看发布是否成功。如果发布成功,我会向用户发出一条适当的消息,表明您发布成功,但如果不成功,可能有两个原因:第一:发布执行期间出现一些错误第二:用户未登录。我认识到第一个错误和第二个错误之间的区别只是解析响应 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];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取 cookie 并将其用于其他请求,例如 POST ( iOS )? 的相关文章

随机推荐

  • 插入到java.util.List中的任意位置

    根据文档 您可以将对象插入列表中的任何位置 该界面的用户可以精确控制每个元素在列表中的插入位置 来源 http download oracle com javase 6 docs api java util List html http d
  • 使用shared_ptr的派生类对象的向量

    我有这些课程 class Element class Button public Element class Label public Element class Input public Element 我希望能够创建一个void add
  • Chart.js:组合线形和条形数据

    我想创建一个图表Chart js http www chartjs org 包含两个不同的数据集 一个线数据集和一个条形数据集 您可以在这里查看我的完整代码 function initCombinedChart canvas each fu
  • ruby 访问静态变量

    class A ololo 1 end A ololo A new ololo NoMethodError undefined method ololo 好的 我需要一个 attr reader class B ololo 1 attr r
  • Tensorflow 安装和导入正确,但在尝试使用时抛出异常

    我在使用张量流时遇到问题 看来安装和导入正确 然而 当我调用它时 解释器会抛出一长串异常 其节略如下 我使用的是 OS X El Capitan v 10 11 6 Macbook Pro 15 英寸 2009 年中 2 8 GHz 英特尔
  • 将 Unix 移植到 Windows - pwd.h 的使用

    我正在尝试编译库尼汉 http sourceforge net projects libunihan 使用 MinGW 编写代码 但遇到了需要移植的功能 该函数的目的是获得规范的路径表示 它用pwd h 这是 POSIX 而 MinGW 不
  • 有没有办法让 Pandas ewm 在固定窗口上运行?

    我正在尝试使用熊猫 ewm 函数 https pandas pydata org pandas docs stable reference api pandas DataFrame ewm html计算指数加权移动平均线 然而我注意到信息似
  • 强制拆包的目的

    在 swift 文档中 您可以找到以下内容 if convertedNumber nil println convertedNumber has an integer value of convertedNumber prints conv
  • 如何从Web Worker调用共享Worker?

    是否可以从 Web Worker 调用 Shared Worker 你能给我举个例子吗 就我而言 我有一些网络工作者 我需要在他们之间共享一个单例服务 您可以使用类似于以下内容的技术https stackoverflow com a 307
  • TCPIP 3次握手

    为什么在 TCP 3 次握手的第 3 部分期间没有传输数据 例如 A 到 B SYN B 到 A ACK SYN A 到 B ACK 为什么数据不能与这个 ACK 一起传输 我一直认为这是为了将会话建立阶段与数据传输阶段分开 以便no传输真
  • 将排序后的 hashmap 的键值存储在 string[] 中

    我很抱歉发布这个不清楚的问题 这是我第一次使用 hashmap 因此我很困惑 试图在这里以更好的方式解释这个问题 将 hashmap 的键值存储在 string 中 https stackoverflow com questions 741
  • 如何在 JQuery 1.5.x 中延迟自动打开模态对话框窗口?

    单击以下对话框后效果很好 a href a 位于 html 底部的 javascript 触发该操作 jQuery dialogX dialog bgiframe true autoOpen false modal true 现在 我希望在
  • Azure Web App 和 Azure SQL Server 的 VNet 集成

    我有一个 Azure Web App 和一个 Azure SQL Server 它们都位于同一订阅中 它们都连接到同一 VNet 子网 如下面的快照所示 SQL Server 配置为不允许 Azure 资源和服务访问服务器 因为它应该只允许
  • 使用 Java 删除 XML 中的空标签

    我正在为 servlet 提供一些功能 我想做的一件事是 当接收 InputStream 基本上是解析为 XML 格式的 PDF 文档 时 将该数据设置为 String 对象 然后我尝试删除所有空标签 但到目前为止我还没有得到任何好的结果
  • eclipse 调试器:附加 Maven 依赖项的源代码?

    我想在 myEclipse 8 中调试我们的 web 应用程序时使用 maven 管理的依赖项的源代码 我已设法将源附加到 Maven Managed Dependency 类路径容器中的库 即当我从依赖项打开类文件时 例如使用 Ctrl
  • MongoDB db.getCollection.find 和 db.tablename.find 之间的区别?

    有什么区别 db getCollection booking find and db booking find 它们是否完全相同 或者我什么时候应该使用哪一个 db getCollection booking find id 0J0DR d
  • 如何使用opencv丢弃图像的边缘?

    我正在预处理一些图像 以便从我感兴趣的区域中删除背景 然而 由于相机的焦点 我的长凳上的图像边缘呈圆形 如何丢弃这些圆角边缘并能够仅从图像中删除我感兴趣的对象 下面的代码我可以删除图像的背景 但由于周围的边缘 它无法正常工作 import
  • Android KeyHash 调试时有效,从 APK 安装应用程序时无效

    我使用了 KeyHashthis https stackoverflow com a 6665263 4543067 当然 我将这个 KeyHash 包名称和主要活动类 复制到facebook设置中根据这个 https developers
  • 使用架构标头和目录查找进行 Xml 验证

    如何在不显式指定架构文件的情况下验证 xml 使用 libxml 文件 xsd 文件位于 xml 文件的标头中 相应的 xsd 文件 URL 应使用 Catalog xml 位于本地文件系统中 看起来目前不可能 libxml 2 8 0 这
  • 如何获取 cookie 并将其用于其他请求,例如 POST ( iOS )?

    My 上一个问题 https stackoverflow com questions 12538782 how to remain logged in until user decides to logout 是关于我每次都必须登录才能执行