

# 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.