Skip to content

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.