it-swarm.com.ru

HTTP-запросы в Swift 3

Я довольно новичок в Swift и пытаюсь сделать HTTP-запрос. Я испробовал многие идеи в этом вопросе о переполнении стека , но все они вызывали ошибки при запуске на игровой площадке; Я считаю, что это потому, что они все в Swift 1.0-2.0.

Как я могу сделать HTTP-запрос в Swift 3?

Обновление Я попробовал первое решение, представленное в этот ответ , и после выполнения предложенного Xcode "Fix-it" я обнаружил четыре ошибки :

enter image description here

11
owlswipe

Есть несколько проблем с вашим кодом:

  1. По умолчанию ваше приложение не может подключиться к небезопасному (т.е. HTTP) сайту. Эта функция называется App Transport Security. Вам необходимо сделать исключение в файле _Info.plist_ вашего приложения для подключения к сайтам HTTP.
  2. Это: 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
_
40
Code Different

В вашем коде есть ошибки опечаток (нет переменной url в вызове).

В любом случае, в Swift 3) лучше использовать новую структуру URL и класс URLSession.

Кроме того, XCPlayground теперь является PlaygroundSupport.

И нет необходимости использовать NSString, когда доступна строка.

_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_.

14
ayaio

В вашей ошибке кажется, что 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
9
Ali Kıran