【问题标题】:How to read response cookies using Alamofire如何使用 Alamofire 读取响应 cookie
【发布时间】:2016-03-02 22:52:14
【问题描述】:

我正在尝试读取 post 请求的响应 cookie,如下面的 Postman 所做的那样

我现在尝试没有成功的方法是

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

第一个打印语句包含 10 个没有 cookie 的标题字段,第二个包含一个空数组。

有什么想法吗?

【问题讨论】:

  • 你解决过这个问题吗? Alamofire 的 github 和此处接受的答案都解决了这个问题。我正在使用第 3 方 API,他们在其中使用 cookie 进行会话——但我不知道如何获取它们。

标签: swift cookies alamofire


【解决方案1】:

您需要使用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)
        }
    }
}

斯威夫特 5

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], let URL = response.request?.url
        {
             let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields, for: URL)
             print(cookies)
        }
    }
}

您尝试进行的所有配置自定义都不会产生任何影响。您设置的值已经全部是默认值了。

【讨论】:

  • 遗憾的是它对我不起作用 :( 也打印了空白字段
  • 有没有想过这个问题? Cookies 总是空的。除了 Set-Cookie 之外,我所有的标头都在那里,但 Android 可以看到 Set-Cookie 标头....
  • @cnoon 我遇到了同样的问题,使用上面的代码但是在 cookie 中得到了 0 个元素,请你帮忙。
  • 为什么这个答案会被接受?就像其他人所表达的那样,这并不能解决问题。 Cookie 始终为空白。
【解决方案2】:

如果您只想读取与您交互的域的所有 cookie,您可以使用此方法获取所有 cookie。

let cookies = Alamofire.Manager.sharedInstance.session.configuration.HTTPCookieStorage?.cookiesForURL(NSURL(string: "mydomain.com")! )

它返回一个可选的NSHTTPCookie 项目数组。 (Swift 2.2 和 Alamofire 3.4)

斯威夫特 4.1:

let cookies = Alamofire.SessionManager.default.session.configuration.httpCookieStorage?.cookies(for: url)

【讨论】:

    【解决方案3】:

    上面的代码是正确的,我用这种方式-

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

    【讨论】:

      【解决方案4】:

      请注意,如果 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

      【讨论】:

        【解决方案5】:

        @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){
                        ...
                    }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-25
          • 1970-01-01
          • 2013-09-02
          • 1970-01-01
          • 1970-01-01
          • 2021-04-22
          • 2018-05-21
          • 1970-01-01
          相关资源
          最近更新 更多