我正在尝试阅读帖子请求的响应Cookie,如下面的邮递员所做的那样
我现在正在努力取得成功的方式是
var cfg = NSURLSessionConfiguration.defaultSessionConfiguration()
var cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage()
cfg.HTTPCookieStorage = cookies
cfg.HTTPCookieAcceptPolicy = NSHTTPCookieAcceptPolicy.Always
var mgr = Alamofire.Manager(configuration: cfg)
mgr.request(.POST, "http://example.com/LoginLocalClient", parameters: parameters).responseJSON { response in
print(response.response!.allHeaderFields)
print(NSHTTPCookieStorage.sharedHTTPCookieStorage().cookies)
}
第一个print语句包含没有cookie的10个头字段,第二个包含一个空数组。
有什么想法吗?
答案 0 :(得分:23)
您需要使用NSHTTPCookie
cookiesWithResponseHeaderFields(_:forURL:)方法从响应中提取Cookie。这是一个简单的例子:
func fetchTheCookies() {
let parameters: [String: AnyObject] = [:]
Alamofire.request(.POST, "http://example.com/LoginLocalClient", parameters: parameters).responseJSON { response in
if let
headerFields = response.response?.allHeaderFields as? [String: String],
URL = response.request?.URL
{
let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headerFields, forURL: URL)
print(cookies)
}
}
}
您尝试执行的所有配置自定义都不会产生任何影响。您设置的值已经是所有默认值。
答案 1 :(得分:17)
请注意,如果Cookie未在标题回复中发布,则接受的答案无效。显然,一些cookie会提前提取并存储在共享cookie商店中,并且不会显示在响应中。
您必须使用HTTPCookieStorage.shared.cookies
代替。
斯威夫特3:
Alamofire.request(url, method: HTTPMethod.post, parameters: parameters).responseData { (responseObject) -> Void in
if let responseStatus = responseObject.response?.statusCode {
if responseStatus != 200 {
// error
} else {
// view all cookies
print(HTTPCookieStorage.shared.cookies!)
}
}
}
信用转到Travis M。
答案 2 :(得分:3)
如果您只想阅读与您正在互动的域名的所有Cookie,您可以使用此方法获取所有Cookie。
let cookies = Alamofire.Manager.sharedInstance.session.configuration.HTTPCookieStorage?.cookiesForURL(NSURL(string: "mydomain.com")! )
它返回一个NSHTTPCookie
项的可选数组。 ( Swift 2.2 和Alamofire 3.4)
let cookies = Alamofire.SessionManager.default.session.configuration.httpCookieStorage?.cookies(for: url)
答案 3 :(得分:1)
@lespommes
这是我收到cookie的唯一方法。现在我终于可以在响应中看到Set-Cookie:
let parameters = ["postLogin": ["login": "mymail@gmail.com", "password": "myPassword"]]
let url = NSURL(string: "your-website-with-cookies.com")
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(parameters, options: [])
Alamofire.request(request)
.responseJSON { response in
debugPrint(response)
if response.result.isSuccess {
...
}
}else if (response.result.isFailure){
...
}
}
答案 4 :(得分:1)
上面的代码是正确的我用这种方式 -
var allCookies: [NSHTTPCookie]?
if let headerFields = aResponse.response?.allHeaderFields as? [String: String],
URL = aResponse.request?.URL {
allCookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headerFields, forURL: URL)
for cookie in allCookies! {
print(cookie)
let name = cookie.name
if name == "nmSession" {
let value = cookie.value
print(value)
}
}
}