ios - 如何使用 cookie 发出 NSURLSession GET 请求

标签 ios swift nsurlsession

我正在使用 Pinterest SDK 下载 Pinterest Pin 的链接(我从服务器返回的示例链接:https://www.pinterest.com/r/pin/186195765822871832/4801566892554728205/77314e40aeb26c0dc412e9cfa82f8dccc401fdb2b9806a3fe17ba8bafdb50510)。

大约 5 天前,当我试图访问我从 Pinterest 上拉下来的类似链接时,我的 NSURLSession 开始出现 404 错误。

一位 friend 说,他认为 Pinterest 现在必须要求 cookie 才能访问该链接。

如何配置我的 session 以便我可以使用 cookie 并从 Pinterest 获得 200 响应?

更新代码:

import UIKit
import PlaygroundSupport


var url = URL(string: "https://www.pinterest.com/r/pin/186195765822871832/4801566892554728205/77314e40aeb26c0dc412e9cfa82f8dccc401fdb2b9806a3fe17ba8bafdb50510")

var getSourceURLFromPinterest: URLSessionDataTask? = nil
let sessionConfig: URLSessionConfiguration = URLSessionConfiguration.default

sessionConfig.timeoutIntervalForRequest = 30.0
sessionConfig.timeoutIntervalForResource = 30.0

let cookieJar = HTTPCookieStorage.shared
let cookieHeaderField = ["Set-Cookie": "key=value, key2=value2"]
let cookies = HTTPCookie.cookies(withResponseHeaderFields: cookieHeaderField, for: url!)
HTTPCookieStorage.shared.setCookies(cookies, for: url, mainDocumentURL: url)

let session = URLSession(configuration: sessionConfig)
getSourceURLFromPinterest = session.dataTask(with: url! as URL) { (data: Data?, response: URLResponse?, error: Error?) -> Void in

        if error != nil {
        print("error is \(error)")
    }
    if response == nil {
    print("no response")

    } else if let _ = data {

        //Config Request
        let request = NSMutableURLRequest(
            url: (response?.url)!,
            cachePolicy: .reloadIgnoringLocalAndRemoteCacheData,
            timeoutInterval: 30.0)
        request.httpMethod = "HEAD"

        var statusCode = Int()
        let session = URLSession.shared
        let checkURLForResponse = session.dataTask(with: request as URLRequest) {urlData, myResponse, responseError in
            if let httpResponse = myResponse as? HTTPURLResponse {
                 statusCode = httpResponse.statusCode
                               switch statusCode {
                case  _ where statusCode < 500 && statusCode > 299 && statusCode != 405: //whitelisted 405 to exclude Amazon.com false errors
                    print("status code \(statusCode) for \(url)")
                default:
                    break;
                }
            } else {  print("***NO httpResponse for \(url)") }
        }
        checkURLForResponse.resume()
    }
}
 getSourceURLFromPinterest!.resume()

PlaygroundPage.current.needsIndefiniteExecution = true

最佳答案

其他答案可能一般有效,但特别是对我而言,这是我对请求进行编码以便从 Pinterest 服务器获得响应的方式。请注意,我认为我所做的具体与 Pinterest 服务器中可能存在的错误有关,请参阅:https://github.com/pinterest/ios-pdk/issues/124

我注释掉了我的个人 Pinterest session ID

var cookieSession = String()
var cookieCSRFToken = String()

var myWebServiceUrl = URL(string: "https://www.pinterest.com/r/pin/186195765821344905/4801566892554728205/a9bb098fcbd6b73c4f38a127caca17491dafc57135e9bbf6a0fdd61eab4ba885")

let requestOne = URLRequest(url: myWebServiceUrl!)
let sessionOne = URLSession.shared

let taskOne = sessionOne.dataTask(with: requestOne, completionHandler: { (data, response, error) in
    if let error = error {
        print("ERROR: \(error)")
    }
    else {
        print("RESPONSE: \(response)")

        if let data = data, let dataString = String(data: data, encoding: .utf8) {
            print("DATA: " + dataString)
        } // end: if

        var cookies:[HTTPCookie] = HTTPCookieStorage.shared.cookies! as [HTTPCookie]
        print("Cookies Count = \(cookies.count)")
        for cookie:HTTPCookie in cookies as [HTTPCookie] {

            // Get the _pinterest_sess ID
            if cookie.name as String == "_pinterest_sess" {
                //var cookieValue : String = "CookieName=" + cookie.value as String
                cookieSession = cookie.value as String
                print(cookieSession)
            }

            // Get the csrftoken
            if cookie.name as String == "csrftoken" {
                cookieCSRFToken = cookie.value
                print(cookieCSRFToken)
            }
        } // end: for

    } // end: if
})
taskOne.resume()

var requestTwo = URLRequest(url: myWebServiceUrl!)

cookieSession = "XXXXXXXX"

cookieCSRFToken = "JHDylCCKKNToE4VXgofq1ad3hg06uKKl"

var cookieRequest = "_auth=1; _b=\"AR4XTkMmqo9JKradOZyuMoSWcMdsBMuBHHIM21wj2RPInwdkbl2yuy56yQR4iqxJ+N4=\"; _pinterest_pfob=disabled; _pinterest_sess=\"" + cookieSession + "\"; csrftoken=" + cookieCSRFToken as String


requestTwo.setValue(cookieRequest as String, forHTTPHeaderField: "Cookie")


let taskTwo = sessionOne.dataTask(with: requestTwo, completionHandler: { (data, response, error) in
    if let error = error {
        print("ERROR: \(error)")
    }
    else {
        print("RESPONSE: \(response)")

    } // end: if
})
taskTwo.resume()

PlaygroundPage.current.needsIndefiniteExecution = true

关于ios - 如何使用 cookie 发出 NSURLSession GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407623/

相关文章:

ios - 错误链接器命令失败,退出代码为 1(Paytm 支付集成时)

ios - 如何在 audioPlayerDidFinishPlaying 方法中使用多个 play()

swift - 实时更新 NSSlider 的值

ios - 将 UIBarButton 的 tintcolor 更改为 UIButton 作为其自定义 View

ios - 由于 iOS 10 中错误的随机数计数,HTTP 摘要身份验证失败

ios - objective-C : Issue faced while editing multiple row simultaneously in table view

ios - AR 引用图像平面在 iOS Swift 中的位置不正确?

objective-c - 填充表格 View - 如何在某些条件下不返回任何单元格

swift - 对成员 'dataTask(with:completionHandler:)' swift 3.0 的模糊引用

ios - NSURLSessionDownloadTaskDelegate JSON 响应