How to make HTTP request in Swift?

http, ios, nsurlsession, swift

Solution

You can use `URL`, `URLRequest` and `URLSession` or `NSURLConnection` as you'd normally do in Objective-C. Note that for iOS 7.0 and later, `URLSession` is preferred.

Using `URLSession`

Initialize a `URL` object and a `URLSessionDataTask` from `URLSession`. Then run the task with `resume()`.

let url = URL(string: "http://www.stackoverflow.com")!

let task = URLSession.shared.dataTask(with: url) {(data, response, error) in
    guard let data = data else { return }
    print(String(data: data, encoding: .utf8)!)
}

task.resume()

Using `NSURLConnection`

First, initialize a `URL` and a `URLRequest`:

let url = URL(string: "http://www.stackoverflow.com")!
var request = URLRequest(url: url)
request.httpMethod = "POST" 

Then, you can load the request asynchronously with:

NSURLConnection.sendAsynchronousRequest(request, queue: OperationQueue.main) {(response, data, error) in
    guard let data = data else { return }
    print(String(data: data, encoding: .utf8)!)
}

Or you can initialize an `NSURLConnection`:

let connection = NSURLConnection(request: request, delegate:nil, startImmediately: true)

Just make sure to set your delegate to something other than `nil` and use the delegate methods to work with the response and data received.

For more detail, check the documentation for the `NSURLConnectionDataDelegate` protocol

Testing on an Xcode playground

If you want to try this code on a Xcode playground, add `import PlaygroundSupport` to your playground, as well as the following call:

PlaygroundPage.current.needsIndefiniteExecution = true

This will allow you to use asynchronous code in playgrounds.

Problem

I read The Programming Language Swift by Apple in iBooks, but cannot figure out how to make an HTTP request (something like cURL) in Swift. Do I need to import Obj-C classes or do I just need to import default libraries? Or is it not possible to make an HTTP request based on native Swift code?

Original source

Related problems