如何获取 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 )? 的相关文章

  • 如何找到键盘未覆盖的视图部分(UIModalPresenationStyleFormSheet)?

    我有一个视图控制器 显示带有 UITextView 的视图 并且我想在键盘出现时调整视图的大小 以便 UITextView 不会被键盘覆盖 我几乎在所有情况下都可以正常工作 据我所知 仅当视图控制器以 ModalPresentationSt
  • 如何在iOS中处理1到3个手指的滑动手势

    我使用以下代码来处理代码中的 1 根手指滑动 UISwipeGestureRecognizer swipe UISwipeGestureRecognizer alloc initWithTarget self action selector
  • Swift SpriteKit edgeLoopF​​romRect 问题

    下面的代码可以识别底部和顶部边缘场景和球按预期弹开 但是 那左边缘和右边缘现场的情况一直被破坏 如果施加足够的力 球会离开屏幕 然后最终返回 就好像场景的边缘超出了 iPhone 模拟器窗口的边缘 import SpriteKit clas
  • iPhone 上的双精度与浮动

    我刚刚听说 iPhone 本身无法进行双倍操作 从而使它们比常规浮动慢得多 这是真的 证据 我对这个问题很感兴趣 因为我的程序需要高精度计算 而且我将不得不在速度上妥协 iPhone 可以在硬件中执行单精度和双精度算术 在 1176 原始
  • 如何制作带有 SWIFT 图像的弹出窗口

    我想知道如何制作类似于此示例的弹出窗口 原始窗口充满了按钮 选择这些按钮后将拉出我想要使用的图像 我会简单地创建一个可重用的UIView组件以及作为子视图所需的一切 例如UIImageView为了你的形象 UILabel or a UIBu
  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • 每 24 小时触发一次方法

    我正在尝试每天在给定时间触发一个方法 我尝试了一些方法 但我无法真正使其发挥作用 任何意见 将不胜感激 此外 如果无论应用程序是否打开它都会触发 那就更理想了 这可能吗 UI本地通知 http developer apple com lib
  • iOS 中 NSDecimalNumber 的小数分隔符错误

    我尝试通过以下方式输出具有正确的小数分隔符的十进制数的描述 NSString strValue 9 94300 NSDecimalNumber decimalNumber NSDecimalNumber decimalNumberWithS
  • ios swift parse:从 3 个类收集数据

    我有这样的结构 User CardSet 带有指向 User objectId 的指针 user 和 col name 带有点 cards 的卡片到 Card Set objectId 和列 name 我想选择所有卡数据 包括当前用户的卡集
  • iPhone - UIImage imageWithData 返回 nil

    我需要从字节数组创建 UIImage 现在我创建了字节数组 image CGImageCreateWithImageInRect aux CGImage imageRect context CGBitmapContextCreate dat
  • 如何在 iPhone 上使用带有线程的 sqlite + fdbm 库

    相关这个问题 https stackoverflow com questions 1082554 我想把数据加载放在后台 但是 我收到 库例程调用不按顺序 错误 In 这个所以线程 https stackoverflow com quest
  • 如何让UITextView背景线与文字对齐?

    我正在尝试绘制 UITextView 的背景线 这是我用来画这些线的代码 CGContextBeginPath context CGContextSetStrokeColorWithColor context self horizontal
  • UIViewControllerAnimatedTransitioning:旋转更改后黑屏片段

    我已经创建了一个视图控制器转换 只要我不更改设备方向 一切都正常 图 1 显示了应有的屏幕 然后我切换到下一个视图控制器 在其中更改方向 现在我回到第一个视图控制器并再次切换方向 然后我得到的结果如图 2 所示 出现黑色边框 请不要介意屏幕
  • 如何在代码中编辑约束

    我有一个以 100 开始宽度限制的网页 当用户单击按钮时 我想将约束更改为 200 我试过这个 NSLayoutConstraint constrain NSLayoutConstraint constraintWithItem self
  • TableViewController 的 viewDidLoad 未触发

    我一直在关注这个tutorial http www appcoda com ios programming sidebar navigation menu 有一个滑出式菜单 我添加了一个 TableViewController 它将显示文章
  • Objective-C 中发送给对象的消息可以被监听或者打印出来吗? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 中拦截方法调用 https stackoverflow com questions 1618474 intercept method call in objective c 如
  • 如何解决 Xcode 5 中的红色(已移动)文件?

    在 Xcode 4 中 当您要移动文件时 可以通过单击右侧菜单中的按钮并通过 Finder 选择新位置来解析文件的新位置 在 Xcode 5 中 右侧菜单中没有按钮 我还没有找到任何方法通过右键单击文件或顶部菜单栏选项来指定文件的新位置 在
  • 在 iFrame 内维护会话状态

    不确定我是否疯了 但我在 iFrame 内的会话状态遇到问题 它是一个域在另一个域中的简单设置 我不需要跨域共享任何内容 我想做的就是将一个网站嵌入到另一个网站中 并且我希望该嵌入网站能够使用 cookie 会话状态登录 编辑 更新 等 为
  • 模态转场需要点击 2 次而不是 1 次

    我的 UITableView 需要点击 2 次才能显示所选单元格的详细信息页面 一次用于选择 另一次用于显示详细信息视图 我希望有一个 CLI 直接显示所单击单元格的详细视图 我在 UITableViewManager m 中使用此方法的模
  • 像 TraceGL 一样分析 Objective C 中的代码路径?

    TraceGL 是一个非常简洁的项目 它允许 JS 程序员跟踪 Javascript 中的代码路径 它看起来像这样 我想为 Objective C 构建类似的东西 我知道运行时使跟踪方法调用变得相当容易 但是我如何跟踪控制流 例如 在上面的

随机推荐

  • 插入到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 是关于我每次都必须登录才能执行