web-dev-qa-db-ja.com

Swift 3のHTTPリクエスト

私はSwiftにかなり慣れていないので、HTTPリクエストを作成しようとしています。私は多くのアイデアを試しました このStack Overflowの質問 ですが、プレイグラウンドで実行するとすべてエラーが発生しました。これらはすべてSwift 1.0-2.0。

Swift3でHTTPリクエストを作成するにはどうすればよいですか?

Updateこの回答 で提示された最初の解決策を試しましたが、Xcodeの提案された「修正」を完了した後、4つのエラーが発生しました:

enter image description here

11
owlswipe

コードにはいくつかの問題があります。

  1. デフォルトでは、アプリは安全でない(つまりHTTP)サイトに接続できません。 App Transport Securityと呼ばれる機能です。 HTTPサイトに接続するには、アプリの_Info.plist_ファイルで例外を作成する必要があります。
  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になりました。

また、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()
_

注:これはXcode 8ベータ2用です。ベータ1では、sharedではなくshared()を実行する必要があります。iOSを使用している場合は、_import UIKit_、ただし、代わりに_import Cocoa_を使用すると、このコードはOS Xでも機能します。

14
ayaio

あなたのエラーでは、URLが欠落しているようです。

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