Swift 3中的HTTP请求

owl*_*ipe 11 httprequest swift swift3

我是Swift的新手,我正在尝试发出HTTP请求.我尝试了Stack Overflow问题中的许多想法,但是在操场上运行时都会导致错误; 我相信这是因为他们都在Swift 1.0-2.0中.

如何在Swift 3中发出HTTP请求?

更新我尝试了这个答案中提出的第一个解决方案,在完成Xcode的建议"Fix-it"后,我遇到了四个错误:

在此输入图像描述

Cod*_*ent 40

您的代码有几个问题:

  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
Run Code Online (Sandbox Code Playgroud)


aya*_*aio 14

您的代码中存在拼写错误(调用中没有url变量).

无论如何,在Swift 3中,最好使用新的URL结构和URLSession类.

此外,XCPlayground现在是PlaygroundSupport.

当String可用时,不需要使用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()
Run Code Online (Sandbox Code Playgroud)

注意:这是针对Xcode 8 beta 2.在beta 1上你必须做shared()而不是shared.如果你在iOS不要忘了import UIKit,但是这个代码也适用于OS X,如果你import Cocoa不是.


Ali*_*ran 9

在你的错误中,似乎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
Run Code Online (Sandbox Code Playgroud)