module ActionController::Responders
#
Direct including types
ActionController::Base
Constants#
MIME_TYPES = { binary: "application/octet-stream", json: "application/json", xml: "application/xml", text: "text/plain", html: "text/html", yaml: "text/yaml",}#
common response mime types
REDIRECTION_CODES = { multiple_choices: 300, moved_permanently: 301, found: 302, see_other: 303, not_modified: 304, use_proxy: 305, temporary_redirect: 307, permanent_redirect: 308,}#
codes to use when redirecting
STATUS_CODES = { continue: 100, switching_protocols: 101, processing: 102, ok: 200, created: 201, accepted: 202, non_authoritative_information: 203, no_content: 204, reset_content: 205, partial_content: 206, multi_status: 207, already_reported: 208, im_used: 226, bad_request: 400, unauthorized: 401, payment_required: 402, forbidden: 403, not_found: 404, method_not_allowed: 405, not_acceptable: 406, proxy_authentication_required: 407, request_timeout: 408, conflict: 409, gone: 410, length_required: 411, precondition_failed: 412, payload_too_large: 413, uri_too_long: 414, unsupported_media_type: 415, range_not_satisfiable: 416, expectation_failed: 417, misdirected_request: 421, unprocessable_entity: 422, locked: 423, failed_dependency: 424, upgrade_required: 426, precondition_required: 428, too_many_requests: 429, request_header_fields_too_large: 431, unavailable_for_legal_reasons: 451, internal_server_error: 500, not_implemented: 501, bad_gateway: 502, service_unavailable: 503, gateway_timeout: 504, http_version_not_supported: 505, variant_also_negotiates: 506, insufficient_storage: 507, loop_detected: 508, not_extended: 510, network_authentication_required: 511,}#
standard response codes
Class methods#
.write_string(response : HTTP::Server::Response, body : String) : Nil#
A String is already the complete response body. Crystal's HTTP response switches to chunked transfer when a write reaches its output buffer size; supplying the known length avoids that work for large bodies. Leave custom output wrappers and explicit framing headers in control of their own bytes.
Methods#
#accepts_formats : Array(String)#
Extracts the mime types from the Accept header
Scanned by hand rather than split(";").flat_map(&.split(ACCEPT_SEPARATOR_REGEX)...).
Every route that negotiates a content type runs this on every request, and
the regex plus the intermediate arrays it built dominated the cost.
Behaviour is unchanged, including that only a comma consumes the whitespace
that follows it.
Macros#
head(status)#
only sends the header, no content to be sent.
you should only use render with the Macro DSL
delete "/:id", :destroy do
MyModel.find(route_params["id"]).destroy
head HTTP::Status::ACCEPTED
end
redirect_to(path, status = :found)#
redirects the browser to a new route
you should only use render with the Macro DSL
patch "/:id", :update do
redirect_to "/#{params["id"]}"
end
render(status = :ok, head = nil, json = nil, yaml = nil, xml = nil, html = nil, text = nil, binary = nil, template = nil, partial = nil, layout = nil)#
used to stream a response back to the user, serializing directly to the IO
the content type is set appropriately based on the response type
a call to render implicitly executes a return as the response has been written to the client
you should only use render with the Macro DSL
get "/:id", :show do
render json: MyModel.find(route_params["id"])
end
respond_with(status = :ok#
uses the content-type header to respond in the appropriate format
you should only use render with the Macro DSL
get "/:id", :show do
model = MyModel.find(route_params["id"])
respond_with do
text model # calls to_s(response) on the object passed
json model # calls to_json(response) on the object passed
xml do # can provide a block to perform additional processing too
str = "<set_var>#{model.build_xml}</set_var>"
XML.parse(str)
end
end
end