Adding JSON api to existing Phoenix application

I currently have a working Phoenix application with a well-defined set of routes. Each route roughly implements a CRUD interface, and the bulk of the code was generated using phx.gen.html.

What is the best practice around adding similar routes for a JSON API?


mix phx.gen.json mix phx.gen.json — Phoenix v1.6.10

1 Like

Thanks. I should have been more specific. Can I reuse the existing schemas, and only create API routes?

I would say you definitely want to reuse the existing schemas. In your views you can determine what you return in the JSON response. So if there are values you don’t want to return, don’t include them in the response. If there values from different schemas you want to return in the same response, you need to make an ecto query that joins them.


schemas yes, contextes yes… but You will need to create controllers, fallback_controller, views as well.

another options would be to use graphql. You could reuse almost everything, You just need to add graphql schemas

Yes - Use the --no-context and --no-schema flags. Like this:

mix phx.gen.json Accounts User users --no-context --no-schema

This will look in lib/proj/accounts/user.ex and generate a JSON api route for the schema defined at that file. It will not try to recreate a context module nor a new schema

The order of arguments to the command is:

mix phx.gen.json Context Schema db_table

Context is the phoenix context, Schema is your Elixir schema, and db_table is the table in your database that Schema is linked to

In some cases, you may wish to bootstrap JSON views, controllers, and controller tests, but leave internal implementation of the context or schema to yourself. You can use the --no-context and --no-schema flags for file generation control.