如何使用Alamofire阅读响应cookie

时间:2015-11-29 04:15:45

标签: swift cookies alamofire

我正在尝试阅读帖子请求的响应Cookie,如下面的邮递员所做的那样

enter image description here

我现在正在努力取得成功的方式是

    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个头字段,第二个包含一个空数组。

有什么想法吗?

5 个答案:

答案 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)

Swift 4.1:

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)
                }
            }

        }
相关问题