Response
Best Practice
To simplify debugging, it is better to use structured logging and include a request id into all log messages and HTTP
server response.
Adding such request id is as simple as adding a method for reblocks/request-handler:handle-request
generic-function:
(defmethod reblocks/request-handler:handle-request ((app app))
(let ((*request-id* (make-request-id)))
(reblocks/response:add-header :x-request-id
*request-id*)
(with-fields (:request-id *request-id*)
(call-next-method))))
Here we use log4cl-extras/context:with-fields
macro for structured logging and reblocks/response:add-header
to add the X-Request-Id
header to webserver's response.
Also, you might want to define a method for reblocks/error-handler:on-error
generic-function and show
current request-id to the user. This way he could provide id to support simplifying issue investigation.
API
Use this function to add a HTTP
header:
(add-header :x-request-id "100500")
Adds a "retpath" GET
parameter to the giving URL
.
Keeps all other parameters and overwrites "retpath" parameter if it is
already exists in the URL
.
By default, retpath is the current page, rendered by the reblocks. This is very useful to redirect user to login page and return him to the same page where he has been before.
Use this function to add Set-Cookie header:
(set-cookie (list :name "user_id" :value "bob" :samesite :lax))
Cookie might include these properties:
domain
path
expires
secure
httponly
samesite
Returns a list with a map cookie-name -> cookie:cookie object. Odd items in this list are cookie names and even are lists with cookie parameters.
Aborts request processing by signaling an immediate-response
and returns a given value as response.
HTTP
code and headers are taken from CODE
and CONTENT-TYPE
.
By default, headers and cookies are taken from the current request, but additional headers and cookies may be provides in appropriate arguments.
Makes a new URL
, based on the current request's URL
.
If new-path can be absolute, like /logout or relative, like ./stories.
Also, it can contain a query params like /login?code=100500
Send JavaScript to the browser. The way of sending depends
on whether the current request is via AJAX
or not.
Script may be either a string or a list; if it is a list it will be compiled through Parenscript first.