Как сделать запрос NSURLSesssion GET с помощью файлов cookie

Я использую Pinterest SDK для загрузки ссылки Pinterest Pin, (образец ссылки, который я возвращаюсь с сервера: https://www.pinterest.com/r/pin/186195765822871832/4801566892554728205/77314e40aeb26c0dc412e9cfa82f8dccc401fdb2b9806a3fe17ba8bafdb50510 ).

Около 5 дней назад я начал получать 404 ошибки в моем NSURLSesssion при попытке получить доступ к аналогичным ссылкам, которые я вытащил из Pinterest.

Друг сказал, что, по его мнению, Pinterest теперь должен использовать файлы cookie для доступа к этой ссылке.

Как настроить сеанс, чтобы я мог использовать файлы cookie и получить ответ 200 из Pinterest?

ОБНОВЛЕННЫЙ КОД:

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 

3 Solutions collect form web for “Как сделать запрос NSURLSesssion GET с помощью файлов cookie”

Другие ответы могут работать в целом, но специально для меня это то, как я закодировал запрос, чтобы получить ответ от сервера Pinterest. Обратите внимание, что конкретно то, что я делаю, я думаю, связано с возможной ошибкой на сервере Pinterest, см. https://github.com/pinterest/ios-pdk/issues/124

Я прокомментировал мой личный идентификатор сеанса Pinterest

 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 

Вы можете настроить сеанс на основе файлов cookie следующим образом. Пожалуйста, дайте мне знать, если вам нужна помощь. Ниже приведен пример

  let session: URLSession = URLSession.shared session.dataTask(with: myUrlRequest { urlData, response, responseError in let httpRes: HTTPURLResponse = (response as? HTTPURLResponse)! let cookies:[HTTPCookie] = HTTPCookie.cookies(withResponseHeaderFields: httpRes.allHeaderFields as! [String : String], for: httpRes.url!) HTTPCookieStorage.shared.setCookies(cookies, for: response?.url!, mainDocumentURL: nil) if responseError == nil { }else { } }.resume() 

Не стесняйтесь предлагать изменения, чтобы сделать их лучше. Пожалуйста, дайте мне знать, если ниже не работает.

Когда вы выполняете аутентификацию с сервером, сервер выдает файлы cookie, которые вы получаете в заголовке ответа. Вы можете извлечь это и установить как куки-файл в общем хранилище файлов cookie. Поэтому каждый раз, когда вы делаете звонок, для этого домена файлы cookie будут совместно использоваться и проверяться, и если они действительны, это позволит вам войти.

 let resp: HTTPURLResponse = (response as? HTTPURLResponse)! let cookies:[HTTPCookie] = HTTPCookie.cookies(withResponseHeaderFields: resp.allHeaderFields as! [String : String], for: resp.url!) HTTPCookieStorage.shared.setCookies(cookies, for: response?.url!, mainDocumentURL: nil) 

В этом случае cookies будут массивом, который содержит куки в массиве. Ответ может содержать более одного куки.

В случае, если вы используете стороннюю структуру для управления HTTP-запросами, такими как Alamofire тогда она будет заботиться о самом управлении cookie.

  • UICollectionViewCell остается черным при использовании с SDWebImage
  • CloudKit: проверьте подписку локально
  • Как реализовать салфетки влево и проведите по экрану вправо, чтобы выявить разные метки
  • Swift - Как получить числовые значения для выбранных строк в UITableview
  • Приложение и расширение - использование основных данных == error: sharedApplication () 'недоступно
  • Как открыть ссылки YouTube в SafariController вместо приложения YouTube в iOS в Swift
  • Запрос обратного вызова OAuthSwift на основной поток
  • Почему опция update () предпочтительна для игровой логики, а не для didFinishUpdate?
  • Проблемы с запуском OAuthSwift
  • iOS swift 0 ключ / значение пары для непустого словаря
  • Как получить IP-адрес IPhone без использования стороннего URL-адреса
  • Interesting Posts

    Как анимировать несколько видеослоев одновременно в AVMutableComposition?

    Как я могу написать это перечисление typedef из объектного c в swift?

    Болты / файл Bolts.h не найдены – уже установлен SDK для Facebook

    API UI вызвал фоновый поток com.google.Maps.LabelingBehavior

    База данных Firebase Не равный запрос – Альтернативное решение (для iOS)

    Какое влияние оказывают моделируемые показатели?

    что происходит с данными nsuserdefault, если телефон умирает до синхронизации

    Процесс входа в систему iOS Facebook Framework

    Проверьте, действительно ли работает интернет-соединение устройства iOS

    Как открыть схемы URL из Safari в iOS9?

    Как изменить размер UIView, перетаскивая его по краям?

    Как подключить видео с помощью AVPlayerLooper

    Мантия – преобразование вложенной модели в Swift

    UIImage imageNamed возвращает ноль

    Как бороться с непоследовательными китайскими картами на iOS 6?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.