如何使用Alamofire阅读响应cookie

abi*_*nop 11 cookies swift alamofire

我正在尝试阅读帖子请求的响应cookie,如下面的Postman所做

在此输入图像描述

我现在尝试没有成功的方式是

    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)
}
Run Code Online (Sandbox Code Playgroud)

第一个print语句包含没有cookie的10个头字段,第二个包含一个空数组.

有任何想法吗?

cno*_*oon 24

您需要使用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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您尝试执行的所有配置自定义都不会产生任何影响.您设置的值已经是所有默认值.

  • 遗憾的是它对我不起作用:(也打印了空字段 (3认同)
  • 有没有想过这个?Cookies 总是空的。除了 Set-Cookie 之外,我的所有标头都在那里,但 Android 可以看到 Set-Cookie 标头.... (2认同)

Jon*_*mos 18

请注意,如果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!)
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

幸得特拉维斯中号.


sky*_*ook 5

如果您只想读取与您交互的域的所有 cookie,则可以使用此方法获取所有 cookie。

let cookies = Alamofire.Manager.sharedInstance.session.configuration.HTTPCookieStorage?.cookiesForURL(NSURL(string: "mydomain.com")! )
Run Code Online (Sandbox Code Playgroud)

它返回一个可选的项目数组NSHTTPCookie。(斯威夫特 2.2和阿拉莫菲尔 3.4)

斯威夫特 4.1:

let cookies = Alamofire.SessionManager.default.session.configuration.httpCookieStorage?.cookies(for: url)
Run Code Online (Sandbox Code Playgroud)