【问题标题】:NSURLRequest doesn't send cookiesNSURLRequest 不发送 cookie
【发布时间】:2012-04-14 08:51:41
【问题描述】:

我正在开发一个报亭应用程序并使用 NSURLRequest 来下载问题资产。

NSArray *contents = [issue.tableOfContents objectForKey:kSNTableOfContentsContents];
NSHTTPCookie *cookie;
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSLog(@"HERE GO MY COOKIES");
for (cookie in [cookieJar cookies]) {
    NSLog(@"%@", cookie);
}            
for (NSDictionary *contentItem in contents) {
    NSString *contentURL_string = [contentItem objectForKey:kSNTableOfContentsRemoteURL];
    NSURL *contentURL = [NSURL URLWithString:contentURL_string];
    NSString *fileName = [contentItem objectForKey:kSNTableOfContentsContentsURL];      
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:contentURL];
    NKAssetDownload *asset = [newsstandIssue addAssetWithRequest:request];
    [request release];
    ....
    [asset downloadWithDelegate:self];
    ....
}

当执行第一个 for 循环时,我的 cookie 似乎在 NSHTTPCookieStorage 中,但是当发送实际请求时,标头中没有 cookie 信息。我使用 CharlesProxy 进行查找。任何人都可以提供一些建议可能导致此问题吗?

【问题讨论】:

标签: objective-c ios cocoa-touch cocoa newsstand-kit


【解决方案1】:

来自this thread,魔法咒语似乎是:

NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies:
  [cookieJar cookies]];
[request setAllHTTPHeaderFields:headers];

(警告:未经测试的代码。)

这会将您的 cookie jar 转换为 cookie 数组,然后转换为 NSDictionary 的标头,最后将这些标头装订到您的请求中。正如 Adam Shiemke 在问题勘误表中所链接的那样,这与手动操作相当,但在我看来要干净得多。

根据the documentation,您可能还需要检查HTTPShouldHandleCookies 以查看您的默认cookie 策略是否被正确使用。

【讨论】:

  • 像老板一样工作,但您应该注意,OP 必须创建一个 NSMutableURLRequest 才能使用 setAllHTTPHeaderFields 方法。只需将NSURLRequest *request = [[NSURLRequest alloc] initWithURL:contentURL]; 更改为NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:contentURL];
  • 另外,这对于一个类别来说似乎是一个很好的机会,也是一种可以使用[myMutableURLRequest addAllCookies]的便捷方法
  • 真棒 +1 @MrGomez
【解决方案2】:

在 iOS 项目中,我发现 ASIHTTPRequest 对于此类问题非常有用。它比内置功能做得更好,比如身份验证和 cookie: http://allseeing-i.com/ASIHTTPRequest/

【讨论】:

  • 谢谢,我也使用它,但我找不到让它与 Newsstand Kit 一起使用的方法。你知道他们是否可以一起工作吗?
  • 不确定,我还没用过这个组合。您可以通过allseeing-i.com/ASIHTTPRequest/How-to-use#persistent_cookies 了解更多信息
  • ASIHTTPRequest 不再由编写它的 Ben Copsey 支持(最后一次更新是 2011 年 5 月),他建议不要将它用于新项目
  • 是的,我现在将所有项目转移到 RestKit :)
猜你喜欢
  • 1970-01-01
  • 2013-09-24
  • 2016-12-23
  • 2010-09-30
  • 2018-05-23
  • 2011-11-16
  • 1970-01-01
  • 2011-10-19
  • 2020-03-13
相关资源
最近更新 更多