Struct http_api_problem::HttpApiProblem [−][src]
pub struct HttpApiProblem {
pub type_url: Option<String>,
pub status: Option<StatusCode>,
pub title: Option<String>,
pub detail: Option<String>,
pub instance: Option<String>,
// some fields omitted
}
Expand description
Description of a problem that can be returned by an HTTP API based on RFC7807
Example
{
"type": "https://example.com/probs/out-of-credit",
"title": "You do not have enough credit.",
"detail": "Your current balance is 30, but that costs 50.",
"instance": "/account/12345/msgs/abc",
}
Status Codes and Responses
Prefer to use one of the constructors which
ensure that a StatusCode is set. If no StatusCode is
set and a transformation to a response of a web framework
is made a StatusCode becomes mandatory which in this case will
default to 500
.
When receiving an HttpApiProblem there might be an invalid
StatusCode contained. In this case the status
field will be empty.
This is a trade off so that the recipient does not have to deal with
another error and can still have access to the remaining fields of the
struct.
Fields
type_url: Option<String>
A URI reference RFC3986 that identifies the problem type. This specification encourages that, when dereferenced, it provide human-readable documentation for the problem type (e.g., using HTML [W3C.REC-html5-20141028]). When this member is not present, its value is assumed to be “about:blank”.
status: Option<StatusCode>
The HTTP status code RFC7231, Section 6 generated by the origin server for this occurrence of the problem.
title: Option<String>
A short, human-readable summary of the problem type. It SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization (e.g., using proactive content negotiation; see RFC7231, Section 3.4.
detail: Option<String>
A human-readable explanation specific to this occurrence of the problem.
instance: Option<String>
A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced.
Implementations
Creates a new instance with the given StatusCode.
#Example
use http_api_problem::*;
let p = HttpApiProblem::new(StatusCode::INTERNAL_SERVER_ERROR);
assert_eq!(Some(StatusCode::INTERNAL_SERVER_ERROR), p.status);
assert_eq!(None, p.title);
assert_eq!(None, p.detail);
assert_eq!(None, p.type_url);
assert_eq!(None, p.instance);
pub fn try_new<T: TryInto<StatusCode>>(
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
pub fn try_new<T: TryInto<StatusCode>>(
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
Creates a new instance with the given StatusCode.
Fails if the argument can not be converted into a StatusCode.
#Example
use http_api_problem::*;
let p = HttpApiProblem::try_new(500).unwrap();
assert_eq!(Some(StatusCode::INTERNAL_SERVER_ERROR), p.status);
assert_eq!(None, p.title);
assert_eq!(None, p.detail);
assert_eq!(None, p.type_url);
assert_eq!(None, p.instance);
Creates a new instance with title
derived from a StatusCode.
#Example
use http_api_problem::*;
let p = HttpApiProblem::with_title(StatusCode::NOT_FOUND);
assert_eq!(Some(StatusCode::NOT_FOUND), p.status);
assert_eq!(Some("Not Found"), p.title.as_deref());
assert_eq!(None, p.detail);
assert_eq!(None, p.type_url);
assert_eq!(None, p.instance);
pub fn try_with_title<T: TryInto<StatusCode>>(
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
pub fn try_with_title<T: TryInto<StatusCode>>(
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
Creates a new instance with title
derived from a StatusCode.
Fails if the argument can not be converted into a StatusCode.
#Example
use http_api_problem::*;
let p = HttpApiProblem::try_with_title(404).unwrap();
assert_eq!(Some(StatusCode::NOT_FOUND), p.status);
assert_eq!(Some("Not Found"), p.title.as_deref());
assert_eq!(None, p.detail);
assert_eq!(None, p.type_url);
assert_eq!(None, p.instance);
Creates a new instance with the title
and type_url
derived from the
StatusCode.
#Example
use http_api_problem::*;
let p = HttpApiProblem::with_title_and_type(StatusCode::SERVICE_UNAVAILABLE);
assert_eq!(Some(StatusCode::SERVICE_UNAVAILABLE), p.status);
assert_eq!(Some("Service Unavailable"), p.title.as_deref());
assert_eq!(None, p.detail);
assert_eq!(Some("https://httpstatuses.com/503".to_string()), p.type_url);
assert_eq!(None, p.instance);
pub fn try_with_title_and_type<T: TryInto<StatusCode>>(
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
pub fn try_with_title_and_type<T: TryInto<StatusCode>>(
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
Creates a new instance with the title
and type_url
derived from the
StatusCode.
Fails if the argument can not be converted into a StatusCode.
#Example
use http_api_problem::*;
let p = HttpApiProblem::try_with_title_and_type(503).unwrap();
assert_eq!(Some(StatusCode::SERVICE_UNAVAILABLE), p.status);
assert_eq!(Some("Service Unavailable"), p.title.as_deref());
assert_eq!(None, p.detail);
assert_eq!(Some("https://httpstatuses.com/503".to_string()), p.type_url);
assert_eq!(None, p.instance);
Creates a new instance without any field set.
Prefer to use one of the other constructors which
ensure that a StatusCode is set. If no StatusCode is
set and a transformation to a response of a web framework
is made a StatusCode becomes mandatory which in this case will
default to 500
.
Sets the status
#Example
use http_api_problem::*;
let p = HttpApiProblem::new(StatusCode::NOT_FOUND).title("Error");
assert_eq!(Some(StatusCode::NOT_FOUND), p.status);
assert_eq!(Some("Error"), p.title.as_deref());
assert_eq!(None, p.detail);
assert_eq!(None, p.type_url);
assert_eq!(None, p.instance);
Sets the type_url
#Example
use http_api_problem::*;
let p = HttpApiProblem::new(StatusCode::NOT_FOUND).type_url("http://example.com/my/real_error");
assert_eq!(Some(StatusCode::NOT_FOUND), p.status);
assert_eq!(None, p.title);
assert_eq!(None, p.detail);
assert_eq!(Some("http://example.com/my/real_error".to_string()), p.type_url);
assert_eq!(None, p.instance);
pub fn try_status<T: TryInto<StatusCode>>(
self,
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
pub fn try_status<T: TryInto<StatusCode>>(
self,
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
Tries to set the status
Fails if the argument can not be converted into a StatusCode.
#Example
use http_api_problem::*;
let p = HttpApiProblem::try_new(404).unwrap().title("Error");
assert_eq!(Some(StatusCode::NOT_FOUND), p.status);
assert_eq!(Some("Error"), p.title.as_deref());
assert_eq!(None, p.detail);
assert_eq!(None, p.type_url);
assert_eq!(None, p.instance);
Sets the title
#Example
use http_api_problem::*;
let p = HttpApiProblem::new(StatusCode::NOT_FOUND).title("Another Error");
assert_eq!(Some(StatusCode::NOT_FOUND), p.status);
assert_eq!(Some("Another Error"), p.title.as_deref());
assert_eq!(None, p.detail);
assert_eq!(None, p.type_url);
assert_eq!(None, p.instance);
Sets the detail
#Example
use http_api_problem::*;
let p = HttpApiProblem::new(StatusCode::NOT_FOUND).detail("a detailed description");
assert_eq!(Some(StatusCode::NOT_FOUND), p.status);
assert_eq!(None, p.title);
assert_eq!(Some("a detailed description".to_string()), p.detail);
assert_eq!(None, p.type_url);
assert_eq!(None, p.instance);
Sets the instance
#Example
use http_api_problem::*;
let p = HttpApiProblem::new(StatusCode::NOT_FOUND).instance("/account/1234/withdraw");
assert_eq!(Some(StatusCode::NOT_FOUND), p.status);
assert_eq!(None, p.title);
assert_eq!(None, p.detail);
assert_eq!(None, p.type_url);
assert_eq!(Some("/account/1234/withdraw".to_string()), p.instance);
Add a value that must be serializable.
The key must not be one of the field names of this struct.
Add a value that must be serializable.
The key must not be one of the field names of this struct. If the key is a field name or the value is not serializable nothing happens.
Returns the deserialized field for the given key.
If the key does not exist or the field is not deserializable to
the target type None
is returned
pub fn try_set_value<K, V>(&mut self, key: K, value: &V) -> Result<(), String> where
V: Serialize,
K: Into<String>,
Returns the serde_json::Value
for the given key if the key exists.
Serialize to a JSON Vec<u8>
Serialize to a JSON String
Creates a hyper response.
If status is None
500 - Internal Server Error
is the
default.
Requires the hyper
feature
Creates an actix
response.
If status is None
or not convertible
to an actix status 500 - Internal Server Error
is the
default.
Requires the actix-web
feature
Creates a rocket
response.
If status is None
500 - Internal Server Error
is the
default.
Requires the rocket
feature
Creates a salvo response.
If status is None
500 - Internal Server Error
is the
default.
Requires the salvo
feature
Creates a tide response.
If status is None
500 - Internal Server Error
is the
default.
Requires the tide
feature
please use with_title
instead
please use with_title_and_type
instead
please use status
instead
please use title
instead
please use detail
instead
please use type_url
instead
please use instance
instead
Trait Implementations
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error> where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error> where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Performs the conversion.
Performs the conversion.
Performs the conversion.
Performs the conversion.
Performs the conversion.
Performs the conversion.
Returns Ok
if a Response
could be generated successfully. Otherwise,
returns an Err
with a failing Status
. Read more
Auto Trait Implementations
impl RefUnwindSafe for HttpApiProblem
impl Send for HttpApiProblem
impl Sync for HttpApiProblem
impl Unpin for HttpApiProblem
impl UnwindSafe for HttpApiProblem
Blanket Implementations
Mutably borrows from an owned value. Read more
Instruments this type with the provided Span
, returning an
Instrumented
wrapper. Read more
pub fn into_collection<A>(self) -> SmallVec<A> where
A: Array<Item = T>,
pub fn into_collection<A>(self) -> SmallVec<A> where
A: Array<Item = T>,
Converts self
into a collection.
type Output = T
type Output = T
Should always be Self
pub fn vzip(self) -> V
Attaches the provided Subscriber
to this type, returning a
WithDispatch
wrapper. Read more
Attaches the current default Subscriber
to this type, returning a
WithDispatch
wrapper. Read more
Attaches the provided Subscriber
to this type, returning a
WithDispatch
wrapper. Read more
Attaches the current default Subscriber
to this type, returning a
WithDispatch
wrapper. Read more