Запросы HTTP в Swift 3
Я новичок в Swift и пытаюсь сделать HTTP-запрос. Я пробовал много идей в этом вопросе, но все это вызвало ошибки при работе на игровой площадке; Я считаю, что это потому, что они все в Swift 1.0-2.0.
Как я могу выполнить HTTP-запрос в Swift 3?
Обновление Я попробовал первое решение, представленное в этом ответе, и, после завершения Xcode, предлагаемого "Fix-its", я столкнулся с четырьмя ошибками:
![введите описание изображения здесь]()
Ответы
Ответ 1
Есть пара проблем с вашим кодом:
- По умолчанию ваше приложение не может подключиться к незащищенному (т.е. HTTP) сайту. Это функция под названием App Transport Security. Вы должны сделать исключение в своем приложении
Info.plist
для подключения к HTTP-сайтам.
- Это:
dataTask(urlwith: ! as URL)
. Что вы пытаетесь развернуть с восклицательным знаком (!
)? Какое имя переменной?
Многие имена классов изменились между Swift 2 и 3, поэтому ответы, которые вы нашли, могут быть неприменимы. Ниже приведен пример подключения к httpbin.org для получения вашего IP-адреса:
import PlaygroundSupport
import Foundation
let url = URL(string: "https://httpbin.org/ip")
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
guard error == nil else {
print(error!)
return
}
guard let data = data else {
print("Data is empty")
return
}
let json = try! JSONSerialization.jsonObject(with: data, options: [])
print(json)
}
task.resume()
PlaygroundPage.current.needsIndefiniteExecution = true
Ответ 2
В коде есть ошибки типографии (нет переменной url в вызове).
В любом случае, в Swift 3 лучше использовать новую структуру URL и класс URLSession.
Кроме того, XCPlayground теперь является PlaygroundSupport.
И нет необходимости использовать NSString при наличии String.
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
let url = URL(string: "http://stackoverflow.com/")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
if let data = data,
html = String(data: data, encoding: String.Encoding.utf8) {
print(html)
}
}
task.resume()
Примечание: это для Xcode 8 beta 2. В бета-версии 1 вам нужно будет shared()
вместо shared
. Если вы находитесь на iOS, не забудьте import UIKit
, но этот код также работает для OS X, если вы import Cocoa
вместо этого.
Ответ 3
В вашей ошибке кажется, что url отсутствует. Голый простой вызов api, чтобы помочь вам начать работу.
import UIKit
import Foundation
import PlaygroundSupport
let url:URL = URL(string: "http://jsonplaceholder.typicode.com/posts")!
let session = URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData
let paramString = "data=Hello"
request.httpBody = paramString.data(using: String.Encoding.utf8)
let task = session.dataTask(with: request as URLRequest) {
(
data, response, error) in
guard let data = data, let _:URLResponse = response where error == nil else {
print("error")
return
}
let dataString = String(data: data, encoding: String.Encoding.utf8)
print(dataString)
}
task.resume()
PlaygroundPage.current.needsIndefiniteExecution = true