为 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];
在上面的例子中:
url
、testCookies
和 1
是 值。同样,NSHTTPCookieOriginURL
、NSHTTPCookieName
、NSHTTPCookieValue
是NSDictionary
对象的键,在键值对中。
您使用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]
使用NSHTTPCookieDomain
或NSHTTPCookieOriginURL
的方法。
NSHTTPCookiePath
的值应该是 @"/"
而不是 @"\\"
。
【讨论】:
以上是关于为 NSURLRequest 创建一个 cookie?的主要内容,如果未能解决你的问题,请参考以下文章
更改为WKWebView后在NSURLRequest上缺少一些cookie
iOS HTTP网络请求Cookie的读取与写入(NSHTTPCookieStorage)