oddK
oddK

Reputation: 281

How to post HTTPRequest with cookies in alamofire

I have to post Cookie in Alamofire.
I'm storing cookies after the first login.
After logins, I must post this cookie together.
But it doesn't work.

// 1. restore cookie
let cookie = HTTPCookieStorage.restore() // my custom function.

// 2. set cookie
Alamofire.Session.default.sessionConfiguration.httpCookieStorage?.setCookie(cookie)

// 3. check cookie
print(Alamofire.Session.default.sessionConfiguration.httpCookieStorage?.cookies?.first) // Cookies were set correctly.

// 4. post request
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { (response) in
        if response.response?.statusCode == 200 {
            print("success")
        } else {
            print("fail")
        }
}

But response is always fail.
Am I wrong to set cookies?
I need your help. Thanks.

=============================== Addition

Thank you for your answer. I had tried your code like this.

guard let cookie = HTTPCookieStorage.restore() else { return }
let configuration = URLSessionConfiguration.af.default
configuration.httpCookieStorage?.setCookie(cookie)
let session = Session(configuration: configuration)

session.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { (response) in
    if response.response?.statusCode == 200 {
        print("success")
    } else {
        print("fail")
    }

But sometimes it succeeds but most crash.
Crash message is Fatal error: dataTask received data for incorrect Request subclass: nil: file /Users/J/Documents/AJLiOS/Pods/Alamofire/Source/SessionDelegate.swift, line 189

Do you have any doubts?

Upvotes: 1

Views: 1021

Answers (1)

Jon Shier
Jon Shier

Reputation: 12790

You cannot modify the the configuration of a URLSession after the URLSession has been initialized, see Apple's documentation.

In Alamofire 5, you can initialize your own Session instance and set the cookies there:

let configuration = URLSessionConfiguration.af.default
configuration.httpCookieStorage?.setCookie(HTTPCookieStore.restore())
let session = Session(configuration: configuration)

Upvotes: 1

Related Questions