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

Content#

In Vapor 3, all content types (JSON, protobuf, URLEncodedForm, Multipart, etc) are treated the same. All you need to parse and serialize content is a Codable class or struct.

For this introduction, we will use JSON as an example. But keep in mind the API is the same for any supported content type.

Request#

Let’s take a look at how you would parse the following HTTP request.

POST /login HTTP/1.1
Content-Type: application/json

{
    "email": "user@vapor.codes",
    "password": "don't look!"
}

First, create a struct or class that represents the data you expect.

import Vapor

struct LoginRequest: Content {
    var email: String
    var password: String
}

Then simply conform this struct or class to Content. Now we are ready to decode that HTTP request.

router.post("login") { req -> Future<HTTPStatus> in
    return req.content.decode(LoginRequest.self).map(to: HTTPStatus.self) { loginRequest in
        print(loginRequest.email) // user@vapor.codes
        print(loginRequest.password) // don't look!
        return .ok
    }
}

We use .map(to:) here since req.content.decode(_:) returns a future.

Response#

Let’s take a look at how you would create the following HTTP response.

HTTP/1.1 200 OK
Content-Type: application/json

{
    "name": "Vapor User",
    "email": "user@vapor.codes"
}

Just like decoding, first create a struct or class that represents the data that you are expecting.

import Vapor

struct User: Content {
    var name: String
    var email: String
}

Then just conform this struct or class to Content. Now we are ready to encode that HTTP response.

router.get("user") { req -> User in
    return User(
        name: "Vapor User",
        email: "user@vapor.codes"
    )
}

Great job! Now you know how to encode and decode data in Vapor.

Tip

See Vapor → Content for more in-depth information.

The next section in this guide is Async.