2016-07-10 6 views
11

私はSwiftをかなり新しくしており、HTTPリクエストを作成しようとしています。私は多くのアイデアを試しましたin this Stack Overflow question、しかし、すべては、遊び場で実行するとエラーが発生しました。私はこれがSwift 1.0-2.0のすべてであるためだと思います。SwiftでのHTTPリクエスト3

SwiftでHTTPリクエストを行うにはどうすればいいですか?

更新は私が最初のソリューションは、Xcodeの者が提案完了した後、this answerに提示してみました「修正-その」私は4つのエラーが発生しました:あなたのエラーで

enter image description here

+0

遊び場での作業私の質問を解決していない! –

+0

@AliKıran[OK]を...それdoesnのでHTTP応答を待つ必要が

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 
owlswipe

+0

これは、プレイグラウンドで非同期コードをテストするためのヒントです。また、どんな種類のエラーが発生したのかを質問すると、より多くの情報が得られます。 –

答えて

40

はカップルのあなたのコードに問題があります。デフォルトでは

  1. 、あなたのアプリケーションは、安全でない(すなわち、HTTP)サイトに接続することはできません。これはApp Transport Securityと呼ばれる機能です。 HTTPサイトに接続するには、アプリのInfo.plistファイルで例外を作成する必要があります。
  2. これはdataTask(urlwith: ! as URL)です。あなたは感嘆符(!)でアンラップしようとしていますか?変数名は何ですか?

Swift 2と3の間で多くのクラス名が変更されているため、見つかった回答は適用されない可能性があります。以下は、あなたのIPアドレスを取得するためにhttpbin.orgに接続する例を示します。

あなたが XCPlaygroundPage.currentPage.needsIndefiniteExecution =真
+1

それを愛する!パーフェクト、そしてヒントのおかげで(私は最初のものを知っていました。そして、2番目のものは、Xcodeが奇妙な修正をしてきたことから、その奇妙な感嘆符が出ました! – owlswipe

8

それは、URL missing.Hereが裸のようですあなたが始めるための簡単な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 
+0

ありがとう!このコードサンプルはうまく機能しますが、私の間違いがURLを含まないとは思わないことです。 – owlswipe

+0

@Robコードレビューをいただきありがとうございます。フィードバックに応じてサンプルを更新しています。NSStringを印刷する方法によってフォーマットされた出力が得られます。しかし、あまり意味がありません –

13

コードに入力ミス(呼び出しで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() 

注:これは、あなたの代わりにsharedshared()をしなければならないでしょうベータ1にはXcodeの8ベータ2用です。あなたがiOS上にいる場合は、import UIKitを忘れないでください。代わりにimport Cocoaなら、このコードはOS Xでも動作します。

+0

ありがとうございました!これはまったく同じですが、コードの2つのエラーを修正するまで受け入れられません:5行目に 'shared'の後にa()を追加し、最初にUIKitをインポートする必要があります自明のようです。 – owlswipe

+0

ご協力いただきありがとうございます。 – owlswipe

+0

あなたは大歓迎です。 – Moritz