我正在尝试从抓取的网站数据创建登录 API(我已获得这样做的许可)。目前网站的登录执行具有多个重定向的 POST 请求。在每次重定向时,响应 cookie 似乎总是包含一个新的 SET-COOKIE 以及一些值,即 session ID。
我已经能够在 Hurtl.it 网站上以及通过 Postman 和 Paw 等程序完美地完成请求,但除非我明确输入返回的 cookie,否则我无法通过 Alamofire 或 NSURLSession 正确完成请求来自 Postman 或 Paw,其中包含 session ID 以及重定向期间设置的其他 cookie。
我想知道是否可以将 cookie 设置为在 Swift 重定向期间自动更新并发送更新的 cookie。
这是当前正在使用的 Alamofire 代码,它返回正确的输出,但仅针对输入的 session ID/cookie,因此即使我更改用户名/密码,它仍然会输出结果,就好像它们从未需要更改一样:
func sendRequestRequest() {
// Add Headers
let headers = [
"Cookie":"Cookie string taken explicitly from Paw or Postman",
"Content-Type":"application/x-www-form-urlencoded",
]
// Form URL-Encoded Body
let body = [
"inputEnterpriseId":"username",
"password":"password",
"queryString":"null",
"BTN_LOGIN":"Login",
]
// Fetch Request
Alamofire.request(.POST, "url", headers: headers, parameters: body, encoding: .URL)
.validate(statusCode: 200..<300)
.responseString { response in
if (response.result.error == nil) {
debugPrint("HTTP Response Body: \(response.result.value)")
}
else {
debugPrint("HTTP Request failed: \(response.result.error)")
}
}
}
如果有人需要更多信息,请告诉我。非常感谢您的帮助!
最佳答案
我找到了答案,但最终使用 NSURLSession 来做到这一点。解决我的 cookie 问题的部分是:
if let httpResponse = response as? NSHTTPURLResponse, let fields = httpResponse.allHeaderFields as? [String : String] {
let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(fields, forURL: response!.URL!)
NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookies(cookies, forURL: response!.URL!, mainDocumentURL: nil)
for cookie in cookies {
var cookieProperties = [String: AnyObject]()
cookieProperties[NSHTTPCookieName] = cookie.name
cookieProperties[NSHTTPCookieValue] = cookie.value
cookieProperties[NSHTTPCookieDomain] = cookie.domain
cookieProperties[NSHTTPCookiePath] = cookie.path
cookieProperties[NSHTTPCookieVersion] = NSNumber(integer: cookie.version)
cookieProperties[NSHTTPCookieExpires] = NSDate().dateByAddingTimeInterval(31536000)
let newCookie = NSHTTPCookie(properties: cookieProperties)
NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookie(newCookie!)
print("name: \(cookie.name) value: \(cookie.value)")
}
关于swift - 在 Swift 中通过多个重定向自动从 HTTP Post 请求更新 Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39151071/