pub trait Responder<'r> {
// Required method
fn respond_to(self, request: &Request<'_>) -> Result<'r>;
}
Expand description
Trait implemented by types that generate responses for clients.
Types that implement this trait can be used as the return type of a handler,
as illustrated below with T
:
#[get("/")]
fn index() -> T { /* ... */ }
In this example, T
can be any type, as long as it implements Responder
.
§Return Value
A Responder
returns an Ok(Response)
or an Err(Status)
:
-
An
Ok
variant means that theResponder
was successful in generating aResponse
. TheResponse
will be written out to the client. -
An
Err
variant means that theResponder
could not or did not generate aResponse
. The containedStatus
will be used to find the relevant error catcher which then generates an error response.
§Provided Implementations
Rocket implements Responder
for several standard library types. Their
behavior is documented here. Note that the Result
implementation is
overloaded, allowing for two Responder
s to be used at once, depending on
the variant.
-
&str
Sets the
Content-Type
totext/plain
. The string is used as the body of the response, which is fixed size and not streamed. To stream a raw string, useStream::from(Cursor::new(string))
. -
String
Sets the
Content-Type
totext/plain
. The string is used as the body of the response, which is fixed size and not streamed. To stream a string, useStream::from(Cursor::new(string))
. -
&[u8]
Sets the
Content-Type
toapplication/octet-stream
. The slice is used as the body of the response, which is fixed size and not streamed. To stream a slice of bytes, useStream::from(Cursor::new(data))
. -
Vec<u8>
Sets the
Content-Type
toapplication/octet-stream
. The vector’s data is used as the body of the response, which is fixed size and not streamed. To stream a vector of bytes, useStream::from(Cursor::new(vec))
. -
File
Responds with a streamed body containing the data in the
File
. NoContent-Type
is set. To automatically have aContent-Type
set based on the file’s extension, useNamedFile
. -
()
Responds with an empty body. No
Content-Type
is set. -
Option<T>
If the
Option
isSome
, the wrapped responder is used to respond to the client. Otherwise, anErr
with status 404 Not Found is returned and a warning is printed to the console. -
Result<T, E> where E: Debug
If the
Result
isOk
, the wrapped responder is used to respond to the client. Otherwise, anErr
with status 500 Internal Server Error is returned and the error is printed to the console using theDebug
implementation. -
Result<T, E> where E: Debug + Responder
If the
Result
isOk
, the wrappedOk
responder is used to respond to the client. If theResult
isErr
, the wrappedErr
responder is used to respond to the client.
§Implementation Tips
This section describes a few best practices to take into account when
implementing Responder
.
§Debug
A type implementing Responder
should implement the Debug
trait when
possible. This is because the Responder
implementation for Result
requires its Err
type to implement Debug
. Therefore, a type implementing
Debug
can more easily be composed.
§Joining and Merging
When chaining/wrapping other Responder
s, use the
merge()
or join()
methods on
the Response
or ResponseBuilder
struct. Ensure that you document the
merging or joining behavior appropriately.
§Inspecting Requests
A Responder
has access to the request it is responding to. Even so, you
should avoid using the Request
value as much as possible. This is because
using the Request
object makes your responder impure, and so the use of
the type as a Responder
has less intrinsic meaning associated with it. If
the Responder
were pure, however, it would always respond in the same manner,
regardless of the incoming request. Thus, knowing the type is sufficient to
fully determine its functionality.
§Example
Say that you have a custom type, Person
:
struct Person {
name: String,
age: u16
}
You’d like to use Person
as a Responder
so that you can return a
Person
directly from a handler:
#[get("/person/<id>")]
fn person(id: usize) -> Option<Person> {
Person::from_id(id)
}
You want the Person
responder to set two header fields: X-Person-Name
and X-Person-Age
as well as supply a custom representation of the object
(Content-Type: application/x-person
) in the body of the response. The
following Responder
implementation accomplishes this:
use std::io::Cursor;
use rocket::request::Request;
use rocket::response::{self, Response, Responder};
use rocket::http::ContentType;
impl<'r> Responder<'r> for Person {
fn respond_to(self, _: &Request) -> response::Result<'r> {
Response::build()
.sized_body(Cursor::new(format!("{}:{}", self.name, self.age)))
.raw_header("X-Person-Name", self.name)
.raw_header("X-Person-Age", self.age.to_string())
.header(ContentType::new("application", "x-person"))
.ok()
}
}
Required Methods§
sourcefn respond_to(self, request: &Request<'_>) -> Result<'r>
fn respond_to(self, request: &Request<'_>) -> Result<'r>
Returns Ok
if a Response
could be generated successfully. Otherwise,
returns an Err
with a failing Status
.
The request
parameter is the Request
that this Responder
is
responding to.
When using Rocket’s code generation, if an Ok(Response)
is returned,
the response will be written out to the client. If an Err(Status)
is
returned, the error catcher for the given status is retrieved and called
to generate a final error response, which is then written out to the
client.
Implementations on Foreign Types§
source§impl<'r> Responder<'r> for &'r str
impl<'r> Responder<'r> for &'r str
Returns a response with Content-Type text/plain
and a fixed-size body
containing the string self
. Always returns Ok
.
fn respond_to(self, _: &Request<'_>) -> Result<'r>
source§impl<'r> Responder<'r> for &'r [u8]
impl<'r> Responder<'r> for &'r [u8]
Returns a response with Content-Type application/octet-stream
and a
fixed-size body containing the data in self
. Always returns Ok
.
fn respond_to(self, _: &Request<'_>) -> Result<'r>
source§impl<'r> Responder<'r> for ()
impl<'r> Responder<'r> for ()
Returns an empty, default Response
. Always returns Ok
.
fn respond_to(self, _: &Request<'_>) -> Result<'r>
source§impl<'r> Responder<'r> for String
impl<'r> Responder<'r> for String
Returns a response with Content-Type text/plain
and a fixed-size body
containing the string self
. Always returns Ok
.
fn respond_to(self, _: &Request<'_>) -> Result<'r>
source§impl<'r> Responder<'r> for Vec<u8>
impl<'r> Responder<'r> for Vec<u8>
Returns a response with Content-Type application/octet-stream
and a
fixed-size body containing the data in self
. Always returns Ok
.
fn respond_to(self, _: &Request<'_>) -> Result<'r>
source§impl<'r> Responder<'r> for File
impl<'r> Responder<'r> for File
Returns a response with a sized body for the file. Always returns Ok
.
fn respond_to(self, _: &Request<'_>) -> Result<'r>
source§impl<'r, R: Responder<'r>> Responder<'r> for Option<R>
impl<'r, R: Responder<'r>> Responder<'r> for Option<R>
If self
is Some
, responds with the wrapped Responder
. Otherwise prints
a warning message and returns an Err
of Status::NotFound
.
fn respond_to(self, req: &Request<'_>) -> Result<'r>
source§impl<'r, R: Responder<'r>, E: Debug> Responder<'r> for Result<R, E>
impl<'r, R: Responder<'r>, E: Debug> Responder<'r> for Result<R, E>
If self
is Ok
, responds with the wrapped Responder
. Otherwise prints
an error message with the Err
value returns an Err
of
Status::InternalServerError
.
default fn respond_to(self, req: &Request<'_>) -> Result<'r>
source§impl<'r, R: Responder<'r>, E: Responder<'r> + Debug> Responder<'r> for Result<R, E>
impl<'r, R: Responder<'r>, E: Responder<'r> + Debug> Responder<'r> for Result<R, E>
Responds with the wrapped Responder
in self
, whether it is Ok
or
Err
.
fn respond_to(self, req: &Request<'_>) -> Result<'r>
Implementors§
impl<'a> Responder<'a> for Redirect
Constructs a response with the appropriate status code and the given URL in
the Location
header field. The body of the response is empty. If the URI
value used to create the Responder
is an invalid URI, an error of
Status::InternalServerError
is returned.
impl<'r> Responder<'r> for Status
The response generated by Status
depends on the status code itself. The
table below summarizes the functionality:
Status Code Range | Response |
---|---|
[400, 599] | Forwards to catcher for given status. |
100, [200, 205] | Empty with status of self . |
All others. | Invalid. Errors to 500 catcher. |
In short, a client or server error status codes will forward to the
corresponding error catcher, a successful status code less than 206
or
100
responds with any empty body and the given status code, and all other
status code emit an error message and forward to the 500
(internal server
error) catcher.
impl<'r> Responder<'r> for NoContent
Sets the status code of the response to 204 No Content.
impl<'r> Responder<'r> for NamedFile
Streams the named file to the client. Sets or overrides the Content-Type in
the response according to the file’s extension if the extension is
recognized. See ContentType::from_extension()
for more information. If
you would like to stream a file with a different Content-Type than that
implied by its extension, use a File
directly.
impl<'r> Responder<'r> for Response<'r>
impl<'r, E: Debug> Responder<'r> for Debug<E>
impl<'r, R: Responder<'r> + Hash> Responder<'r> for Created<R>
In addition to setting the status code, Location
header, and finalizing
the response with the Responder
, the ETag
header is set conditionally if
a Responder
is provided that implements Hash
. The ETag
header is set
to a hash value of the responder.
impl<'r, R: Responder<'r>> Responder<'r> for Css<R>
Sets the Content-Type of the response then delegates the remainder of the response to the wrapped responder.
impl<'r, R: Responder<'r>> Responder<'r> for Html<R>
Sets the Content-Type of the response then delegates the remainder of the response to the wrapped responder.
impl<'r, R: Responder<'r>> Responder<'r> for JavaScript<R>
Sets the Content-Type of the response then delegates the remainder of the response to the wrapped responder.
impl<'r, R: Responder<'r>> Responder<'r> for Json<R>
Sets the Content-Type of the response then delegates the remainder of the response to the wrapped responder.
impl<'r, R: Responder<'r>> Responder<'r> for MsgPack<R>
Sets the Content-Type of the response then delegates the remainder of the response to the wrapped responder.
impl<'r, R: Responder<'r>> Responder<'r> for Plain<R>
Sets the Content-Type of the response then delegates the remainder of the response to the wrapped responder.
impl<'r, R: Responder<'r>> Responder<'r> for Xml<R>
Sets the Content-Type of the response then delegates the remainder of the response to the wrapped responder.
impl<'r, R: Responder<'r>> Responder<'r> for Accepted<R>
Sets the status code of the response to 202 Accepted. If the responder is
Some
, it is used to finalize the response.
impl<'r, R: Responder<'r>> Responder<'r> for BadRequest<R>
Sets the status code of the response to 400 Bad Request. If the responder is
Some
, it is used to finalize the response.
impl<'r, R: Responder<'r>> Responder<'r> for Conflict<R>
Sets the status code of the response to 409 Conflict. If the responder is
Some
, it is used to finalize the response.
impl<'r, R: Responder<'r>> Responder<'r> for Created<R>
Sets the status code of the response to 201 Created. Sets the Location
header to the String
parameter in the constructor.
The optional responder finalizes the response if it exists. The wrapped responder should write the body of the response so that it contains information about the created resource. If no responder is provided, the response body will be empty.
impl<'r, R: Responder<'r>> Responder<'r> for Custom<R>
Sets the status code of the response and then delegates the remainder of the response to the wrapped responder.
impl<'r, R: Responder<'r>> Responder<'r> for Forbidden<R>
Sets the status code of the response to 403 Forbidden. If the responder is
Some
, it is used to finalize the response.
impl<'r, R: Responder<'r>> Responder<'r> for NotFound<R>
Sets the status code of the response to 404 Not Found.
Sets the status code of the response to 401 Unauthorized. If the responder is
Some
, it is used to finalize the response.
impl<'r, R: Responder<'r>> Responder<'r> for Content<R>
Overrides the Content-Type of the response to the wrapped ContentType
then
delegates the remainder of the response to the wrapped responder.
impl<'r, R: Responder<'r>> Responder<'r> for Flash<R>
Sets the message cookie and then uses the wrapped responder to complete the
response. In other words, simply sets a cookie and delegates the rest of the
response handling to the wrapped responder. As a result, the Outcome
of
the response is the Outcome
of the wrapped Responder
.
impl<'r, T: Read + 'r> Responder<'r> for Stream<T>
Sends a response to the client using the “Chunked” transfer encoding. The maximum chunk size is 4KiB.
§Failure
If reading from the input stream fails at any point during the response, the response is abandoned, and the response ends abruptly. An error is printed to the console with an indication of what went wrong.