Vapor GitHub

You're viewing documentation for an older version. View the latest version

Client#

The client provided by HTTP is used to make outgoing requests to remote servers. Let’s look at a simple outgoing request.

QuickStart#

Let’s jump right in to make a simple HTTP Request. Here’s a basic GET request using your Vapor Droplet.

let query = "..."
let res = try drop.client.get("https://api.spotify.com/v1/search?type=artist&q=\(query)")
print(res)

Clean Up#

The url above can be a little tricky to read, so let’s use the query parameter to clean it up a little bit:

let res = try drop.client.get("https://api.spotify.com/v1/search", query: [
    "type": "artist", 
    "q": query
])

Continued#

In addition to GET requests, Vapor’s client provides support for most common HTTP functions. GET, POST, PUT, PATCH, DELETE

Headers#

You can also add additional headers to the request.

try drop.client.get("http://some-endpoint/json", headers: [
    "API-Key": "vapor123"
])

Custom Request#

You can ask the client to respond to any Request that you create. This is useful if you need to add JSON or FormURLEncoded data to the request.

let req = Request(method: .post, uri: "http://some-endpoint")
req.formURLEncoded = Node(node: [
    "email": "mymail@vapor.codes"
])

try drop.client.respond(to: req)

Re-usable Connection#

Up to this point, we’ve been using drop.client which is a ClientFactory. This creates a new client and TCP connection for each request.

For more better performance, you can create an re-use a single client.

let pokemonClient = try drop.client.makeClient(
    scheme: "http", 
    host: "pokeapi.co",
    securityLayer: .none
)

for i in 0...1 {
    let response = try pokemonClient.get("/api/v2/pokemon/", query: [
        "limit": 20, 
        "offset": i
    ])
    print("response: \(response)")
}

Note

Clients created using .makeClient can not connect to a different server after initialization. (Proxy servers are an exception)

Proxy#

The drop.client can be configured to use a proxy by default.

Config/client.json

{
    "proxy": {
        "hostname": "google.com", 
        "port": 80,
        "securityLayer": "none"
    }
}

For the above example, all requests sent to drop.client.get(...) would be proxied through google.com.