web-dev-qa-db-ja.com

Alamofireを使用して応答Cookieを読み取る方法

以下のPostmanが行ったように、投稿リクエストの応答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)
}

最初の印刷ステートメントにはCookieなしの10個のヘッダーフィールドが含まれ、2番目のステートメントには空の配列が含まれています。

何か案は?

13
abinop

NSHTTPCookiecookiesWithResponseHeaderFields(_: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)
        }
    }
}

実行しようとしている構成のカスタマイズはすべて影響しません。設定した値はすでにすべてデフォルトです。

24
cnoon

ヘッダーレスポンス内に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 に送られます。

17
Jonny Ramos

やり取りしているドメインに対するすべての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
skymook

上記のコードは私がこのように使用した正しいものでした-

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

        }
1
Prakash Raj

@lespommes

これが私がクッキーを受け取った唯一の方法です。これで、ようやく応答でSet-Cookieを確認できます。

    let parameters =  ["postLogin": ["login": "[email protected]", "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){
                ...
            }
    }
1
Boomerange