2016-07-10 53 views
11

Sono relativamente nuovo a Swift e sto provando a fare una richiesta HTTP. Ho provato molte delle idee in this Stack Overflow question, ma tutte hanno causato errori durante l'esecuzione in un parco giochi; Credo che questo sia dovuto al fatto che sono tutti in Swift 1.0-2.0.Richieste HTTP in Swift 3

Come posso effettuare una richiesta HTTP in Swift ?

Aggiornamento ho provato la prima soluzione presentata in this answer e, dopo aver completato Xcode suggerito "Fix-it" Ho incontrato quattro errori:

enter image description here

+0

quando si lavora con parco giochi è necessario attendere per la risposta HTTP con XCPlaygroundPage.currentPage.needsIndefiniteExecution = true –

+0

@ AliKıran Ok ... ma che doesn risolvo la mia domanda! – owlswipe

+0

è solo un suggerimento per testare il codice asincrono nel parco giochi. Inoltre, se fornisci il tipo di errori in questione, ti aiuteremo di più. –

risposta

40

ci sono un paio di problemi con il tuo codice:

  1. Per impostazione predefinita, l'applicazione non può connettersi al sito insicuro (ossia HTTP). È una funzionalità chiamata App Transport Security. È necessario fare un'eccezione nel file Info.plist della tua app per connettersi ai siti HTTP.
  2. Questo: dataTask(urlwith: ! as URL). Cosa stai cercando di scartare con il punto esclamativo (!)? Qual è il nome della variabile?

Molti nomi di classe sono cambiati tra Swift 2 e 3, quindi le risposte che hai trovato potrebbero non essere applicabili. Di seguito è riportato un esempio che si connette a httpbin.org per ottenere il proprio indirizzo 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 
+1

Lo adoro! Perfetto, e grazie per i suggerimenti (conoscevo il primo, e per il secondo uno strano punto esclamativo proveniva da Xcode che faceva una serie di strane correzioni - inclusa quella)! – owlswipe

8

Nel vostro errore sembra url missing.Here nuda semplice chiamata api per aiutarti a iniziare.

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

Grazie! Questo esempio di codice funziona alla grande, è solo che non credo che il mio errore non includesse un URL. – owlswipe

+0

@Rob grazie per la revisione del codice aggiorno il mio campione in base al vostro feedback.Il modo in cui la stampa NSString fornisce l'output formattato.Ma non ha molto senso –

13

Ci sono errori di battitura (nessuna variabile url nella chiamata) nel codice.

Ad ogni modo, in Swift 3 è preferibile utilizzare la nuova struttura URL e la classe URLSession.

Inoltre, XCPlayground è ora PlaygroundSupport.

E non è necessario utilizzare NSString quando String è disponibile.

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() 

Nota: questo è per Xcode 8 Beta 2. Beta 1 si dovrebbe fare shared() invece di shared. Se sei su iOS non dimenticare di import UIKit, ma questo codice funziona anche per OS X se invece è import Cocoa.

+0

Grazie!Funziona completamente per me, ma non posso accettarlo finché non risolvi i due errori nel codice: dovrai aggiungere un() dopo 'shared' sulla riga 5 e aggiungere import Uikit all'inizio, anche se sembra auto-esplicativo. – owlswipe

+0

Capito! Grazie per l'aiuto. – owlswipe

+0

Prego. – Moritz