logo Buffalo slack logo
API Applications
Guides

API Applications

Applications that only serve API end-points, typically JSON, are very different from those that serve HTML, JavaScript, and CSS. In this guide, you’ll learn how to build an API-only app, using Buffalo.

Creating a New API Application

When creating a new Buffalo application using the buffalo new command, the optional --api flag will generate an application that is better suited to serving APIs than a stock Buffalo application.

$ buffalo new --api coke

Slimmed Project Layout

Applications generated with the --api flag don’t contain any front systems. This means there is no templating, stylesheets, etc…

buffalo new coke –api

├── Dockerfile
├── README.md
├── actions
│   ├── actions_test.go
│   ├── app.go
│   ├── home.go
│   ├── home_test.go
│   └── render.go
├── database.yml
├── fixtures
│   └── sample.toml
├── grifts
│   ├── db.go
│   └── init.go
├── inflections.json
├── main.go
└── models
    ├── models.go
    └── models_test.go

buffalo new coke

├── Dockerfile
├── README.md
├── actions
│   ├── actions_test.go
│   ├── app.go
│   ├── home.go
│   ├── home_test.go
│   └── render.go
├── assets
│   ├── css
│   │   └── application.scss
│   ├── images
│   │   ├── favicon.ico
│   │   └── logo.svg
│   └── js
│       └── application.js
├── database.yml
├── fixtures
│   └── sample.toml
├── grifts
│   ├── db.go
│   └── init.go
├── inflections.json
├── locales
│   └── all.en-us.yaml
├── main.go
├── models
│   ├── models.go
│   └── models_test.go
├── node_modles
├── package.json
├── public
│   ├── assets
│   │   └── .keep
│   └── robots.txt
├── templates
│   ├── _flash.html
│   ├── application.html
│   └── index.html
├── webpack.config.js
└── yarn.lock

Tuned actions/app.go actions/render.go Files

API applications have actions/app.go and actions/render.go files that are a good starting point for API applications.

func App() *buffalo.App {
	if app == nil {
		app = buffalo.New(buffalo.Options{
			Env:          ENV,
			SessionStore: sessions.Null{},
			PreWares: []buffalo.PreWare{
				cors.Default().Handler,
			},
			SessionName: "_coke_session",
		})
		app.Use(forceSSL())
		app.Use(middleware.SetContentType("application/json"))

		if ENV == "development" {
			app.Use(middleware.ParameterLogger)
		}

		app.Use(middleware.PopTransaction(models.DB))
		app.GET("/", HomeHandler)
	}
	return app
}
func init() {
	r = render.New(render.Options{})
}
func App() *buffalo.App {
	if app == nil {
		app = buffalo.New(buffalo.Options{
			Env:         ENV,
			SessionName: "_coke_session",
		})
		app.Use(forceSSL())
		if ENV == "development" {
			app.Use(middleware.ParameterLogger)
		}
		app.Use(csrf.New)
		app.Use(middleware.PopTransaction(models.DB))
		app.Use(translations())
		app.GET("/", HomeHandler)
		app.ServeFiles("/", http.FS(public.FS())) // serve files from the public directory
	}
	return app
}
func init() {
	r = render.New(render.Options{
		HTMLLayout:   "application.html",
		TemplatesFS:  templates.FS(),
		AssetsFS:     public.FS(),
		Helpers:      render.Helpers{},
	})
}