为 NSURLRequest 创建一个 cookie?

Posted

技术标签:

【中文标题】为 NSURLRequest 创建一个 cookie?【英文标题】:Create a cookie for NSURLRequest? 【发布时间】:2009-03-27 23:01:25 【问题描述】:

我正在尝试通过 NSMutableURLRequest 中的 cookie 发送身份验证字符串。我正在尝试通过

创建 NSHTTPCookie
 +(id)cookieWithProperties:(NSDictionary *)properties

但除了用于身份验证的简单键值对之外,我无法找到如何指定属性。当我只使用我的键值对时,返回 nil。

我们将不胜感激任何关于此的示例、文档或想法。

【问题讨论】:

请发布您用于创建 cookie 的代码;你看过developer.apple.com/DOCUMENTATION/Cocoa/Reference/Foundation/… 【参考方案1】:

我注意到,在我的 2.2.1 iphone 上,如果未指定 NSHTTPCookiePath,则不会创建 cookie,即使它在文档中显示为“可选”:

所以,我愿意:

NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:
                            @"domain.com", NSHTTPCookieDomain,
                            @"/", NSHTTPCookiePath,  // IMPORTANT!
                            @"testCookies", NSHTTPCookieName,
                            @"1", NSHTTPCookieValue,
                            nil];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:properties];

NSArray* cookies = [NSArray arrayWithObjects: cookie, nil];

NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];

[request setAllHTTPHeaderFields:headers];

【讨论】:

【参考方案2】:

这是您在 cookie 中设置属性的方式:

 NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:
                              url, NSHTTPCookieOriginURL,
                              @"testCookies", NSHTTPCookieName,
                              @"1", NSHTTPCookieValue,
                              nil];
  NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:properties];

在上面的例子中: urltestCookies1。同样,NSHTTPCookieOriginURLNSHTTPCookieNameNSHTTPCookieValueNSDictionary 对象的在键值对中

您使用NSDictionary 设置/获取属性并添加到NSHTTPCookie

【讨论】:

实际上我无法让它工作,只有使用 NSHTTPCookieDomain 和 NSHTTPCookiePath。请参阅 jm 的答案。另外:lists.apple.com/archives/Webkitsdk-dev/2003/Sep/msg00003.html 我能够使用 NSHTTPCookieOriginURL,只要我指定了 NSHTTPCookiePath(感谢 jm 下面的提示)。请注意,您可以在 url 上使用 path 方法来提供值(即 [url path])。【参考方案3】:

我无法让它工作。

但是我得到了这个工作:

NSMutableURLRequest* ret = [NSMutableURLRequest requestWithURL:myURL];
[ret setValue:@"myCookie=foobar" forHTTPHeaderField:@"Cookie"];

【讨论】:

【参考方案4】:

我在 jm 的例子中发现了一个错误:NSHTTPCookiePath 应该是@"/",而不是@"\\\\"

NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:
                            @"domain.com", NSHTTPCookieDomain,
                            @"/", NSHTTPCookiePath,  // IMPORTANT!
                            @"testCookies", NSHTTPCookieName,
                            @"1", NSHTTPCookieValue,
                            nil];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:properties];

NSArray* cookies = [NSArray arrayWithObjects: cookie, nil];

NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];

[request setAllHTTPHeaderFields:headers];

【讨论】:

我更新了我的答案。看起来很合理,虽然我没有 iPhone 可以测试了。【参考方案5】:

keyNSHTTPCookiePath在使用时应该存在于字典中

[NSHTTPCookie cookieWithProperties:dictionary]

使用NSHTTPCookieDomainNSHTTPCookieOriginURL 的方法。 NSHTTPCookiePath 的值应该是 @"/" 而不是 @"\\"

【讨论】:

以上是关于为 NSURLRequest 创建一个 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

更改为WKWebView后在NSURLRequest上缺少一些cookie

iOS原生请求获取Cookie值

iOS HTTP网络请求Cookie的读取与写入(NSHTTPCookieStorage)

iOS htttp网络请求cookie的读取与写入(NSHTTPCookieStorage)

cookie

iOS webView 设置cookie