如何在alamofire中设置Cookies?

9

如何在Alamofire中设置Cookies,以便每次我杀死应用程序并重新启动它时,都会发送相同的Cookie?


请分享您尝试过的源代码。 - Krunal
亲爱的Gaurav,我遇到了同样的问题,你找到了有用的解决方案吗? - Niloufar
5个回答

11

Swift 5.1 & Alamofire 5.0

准备好你的 cookies

let cookieProps = [
    HTTPCookiePropertyKey.domain: "##put your domain here##",
    HTTPCookiePropertyKey.path: "/",
    HTTPCookiePropertyKey.name: "##put your cookie key here##",
    HTTPCookiePropertyKey.value: "##put your cookie value here##"
   ]

设置您的Cookie

if let cookie = HTTPCookie(properties: cookieProps) {
    AF.session.configuration.httpCookieStorage?.setCookie(cookie)
}

之后,您可以进行正常的请求,然后将会发送cookie到服务器。

Alamofire.request(
  ##URL##,
  method: ##.post or .get##,
  parameters: parameters
  ).responseString {
    response in 
    ....
}


如果URL的域名改变,Cookie是否会被发送?在我的情况下,我必须使用不同的域名来下载较大的文件。 - Skywalker

6
使用NSHTTPCookie的[cookiesWithResponseHeaderFields(_:forURL:)]方法从响应中获取cookie。
// setCookies
 func setCookies(cookies: NSHTTPCookie){
     Alamofire.Manager.sharedInstance.session.configuration.HTTPCookieStorage?.setCookies(cookies, forURL: response.URL!, mainDocumentURL: nil)
 }

// getCookies
func getCookies() {
    let parameters: [String: AnyObject] = [:]

    Alamofire.request(.POST, "http://test.com/test", parameters: parameters).responseJSON { response in
        if let
            header = response.response?.allHeaderFields as? [String: String],
            URL = response.request?.URL
        {
            let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(header, forURL: URL)
            print(cookies)
        }
    }
}

Swift 3:

func setCookies(cookies: HTTPCookie){
    Alamofire.SessionManager.default.session.configuration.httpCookieStorage?.setCookies(cookies, forURL: URL, mainDocumentURL: nil)
}

Alamofire.request(url, method: HTTPMethod.post, parameters: parameters).responseData { (responseObject) -> Void in

                if let resposecode = responseObject.response?.statusCode {
                    if resposecode != 200 {
                        // error
                    } else {
                        // view all cookies
                        print(HTTPCookieStorage.shared.cookies)
                    }
                }
           }

我想在每次发送请求时设置一个默认的cookie,即使关闭并重新启动应用程序,该cookie也应保持不变。这不是我所期望的。 - Gaurav
@krunal 如果它确实存储了cookie,那么它是如何持久地存储的? - Haywire
每次响应时,您需要获取cookie,并将其存储在永久/默认存储中(称为NSUserDefaults)。每次请求时,从永久存储中获取cookie并与请求一起设置。 - Krunal
有没有内置的方法来管理这个?类似于可加载的会话或类似的东西吗? - Haywire

5

Swift 3.0

let cookies = HTTPCookie.cookies(withResponseHeaderFields: response.allHeaderFields , for: response.URL!)

Alamofire.Manager.sharedInstance.session.configuration.HTTPCookieStorage?.setCookies(cookies, forURL: URL, mainDocumentURL: nil)

Alamofire 的实例是共享单例,所以对于所有请求,cookie 都被设置。 希望对您有帮助。


这是针对单个URL还是我通过Alamofire发出的所有URL请求? - Gaurav
我可以知道你为什么要给我点“踩”的原因吗? - Jaydeep Vora
你能帮忙更新最新的Alamofire代码更改吗? - Gobi M

1
像这样吗?
let httpCookie = HTTPCookie.init(properties:
        [HTTPCookiePropertyKey.version : "0",
        HTTPCookiePropertyKey.name : "MYTestID",
        HTTPCookiePropertyKey.value : "983724dd3dea4924b8d675b0df08b611",
        HTTPCookiePropertyKey.expires : "2027-05-13 09:21:23 +0000"])
    if let cookie = httpCookie {
        HTTPCookieStorage.shared.setCookie(cookie)
    }

这个 cookie 在应用程序重新启动后是否会被保留? - Gaurav
你可以在Appdelegate的didFinishLaunchingWithOptions中重新加载此内容。 - Tony
@Tony 你好,如何在应用程序委托中恢复它们?请给我展示一些代码。 - Niloufar

0
if let fields = response.response?.allHeaderFields as? [String : String]{
            let cookies = HTTPCookie.cookies(withResponseHeaderFields: fields, for: (response.request?.url!)!)
            HTTPCookieStorage.shared.setCookies(cookies, for: (response.request?.url!)!, mainDocumentURL: nil)
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接