Profiles
A profile is a set of values accessible to templates that you can easily switch between. In the TUI, this is via the Profiles modal (hotkey p
by default). In the CLI, use the --profile
(or -p
) flag.
The canonical use case for profiles is to switch between different API hosts. Here's what that looks like:
profiles:
local:
data:
host: http://localhost:5000
production:
data:
host: https://myfishes.fish
requests:
list_fish:
method: GET
url: "{{ host }}/fishes"
But profiles aren't restricted to setting the API host. The data
field can hold whatever fields you want. Here's an example of setting your API user via profiles:
profiles:
user1:
data:
username: user1
user2:
data:
username: user2
requests:
list_fish:
method: GET
url: "https://myfishes.fish/fishes"
authentication:
type: basic
username: "{{ username }}"
password: "{{ file('./password.txt') }}"
Dynamic profile values
Fun fact: profile values are templates! This means you can put dynamic values in your profiles and they'll be rendered automatically with no extra effort. For example, if you want a profile for each user that you may log in as, plus an additional profile that lets you prompt for a username:
profiles:
user1:
data:
username: user1
user2:
data:
username: user2
user_prompt:
data:
username: "{{ prompt(message='Username') }}"
requests:
list_fish:
method: GET
url: "https://myfishes.fish/fishes"
authentication:
type: basic
username: "{{ username }}"
password: "{{ file('./password.txt') }}"
When you send the list_fish
command with the user_prompt
profile selected, it will prompt you to enter a username, then user that value for {{ username }}
.
This feature can also be used to deduplicate common template expressions.
Template caching
In the example above, we saw how a profile field can contain a dynamic template. These dynamic profile fields are automatically cached within the scope of a single request. This means if you use the same field multiple times in a request, the template will only be rendered once. Here's an extension of the above example:
profiles:
user1:
data:
username: user1
user2:
data:
username: user2
user_prompt:
data:
username: "{{ prompt(message='Username') }}"
requests:
list_fish:
method: GET
url: "https://myfishes.fish/fishes"
authentication:
type: basic
username: "{{ username }}"
password: "{{ file('./password.txt') }}"
query:
username: "{{ username }}"
In this example, two different fields in the request (authentication.username
and query.username
) both reference the username
profile field. But the corresponding template {{ prompt(message='Username') }}
is only rendered once. That means you'll only be prompted once for a username, and entered value will be used for both instances of {{ username }}
.
This caching applies only when a single profile field is referenced multiple times within a single request. If you send the same request a second time, you will be prompted again for a username.