Запросы 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