以下のPostmanが行ったように、投稿リクエストの応答Cookieを読み取ろうとしています
私が今成功せずに試みている方法は
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番目のステートメントには空の配列が含まれています。
何か案は?
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)
}
}
}
実行しようとしている構成のカスタマイズはすべて影響しません。設定した値はすでにすべてデフォルトです。
ヘッダーレスポンス内に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 に送られます。
やり取りしているドメインに対するすべてのCookieを読み取りたいだけの場合は、この方法ですべてのCookieを取得できます。
let cookies = Alamofire.Manager.sharedInstance.session.configuration.HTTPCookieStorage?.cookiesForURL(NSURL(string: "mydomain.com")! )
NSHTTPCookie
アイテムのオプションの配列を返します。 (Swift 2.2およびAlamofire 3.4)
let cookies = Alamofire.SessionManager.default.session.configuration.httpCookieStorage?.cookies(for: url)
上記のコードは私がこのように使用した正しいものでした-
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)
}
}
}
@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){
...
}
}