BodyParser
public class BodyParser : RouterMiddleware
The BodyParser
parses the body of the request prior to sending it to the handler. It reads the Content-Type of the message header and populates the RouterRequest
body field with a corresponding ParsedBody
enumeration.
In order for the BodyParser to be used it must first be registered with any routes that are interested in the ParsedBody
payload.
ParsedBody enumeration:
The mappings from the incoming Content-Type to an internal representation of the body are as follows:
.json([String: Any]) // "application/json"
.text(String) // "text/*"
.urlEncoded([String:String]) // "application/x-www-form-urlencoded"
.multipart([Part]) // "multipart/form-data"
.raw(Data) // Any other Content-Type
Each case has a corresponding convenience property, e.g. asURLEncoded: [String:String]
, for accessing the associated data.
Note: If you have not declared a Content-Type header, ParsedBody
will be nil
.
Usage Example:
In this example, all routes to the BodyParser middleware are registered to the BodyParser
middleware. A request with “application/json”, ContentType header is received. It is then parsed as JSON and the value for “name” is returned in the response.
router.all("/name", middleware: BodyParser())
router.post("/name") { request, response, next in
guard let jsonBody = request.parsedBody?.asJSON else {
next()
return
}
let name = jsonBody["name"] as? String ?? ""
try response.send("Hello \(name)").end()
}
Note: When using Codable Routing in Kitura 2.x the BodyParser should not be registered to any codable routes (doing so will log the following error “No data in request. Codable routes do not allow the use of a BodyParser.” and the route handler will not be executed).
-
Initializes a BodyParser instance. Needed since default initalizer is internal.
Usage Example:
let middleware = BodyParser()
Declaration
Swift
public init()
-
This function is called by the Kitura
Router
when an incoming request matches the route provided when the BodyParser was registered with theRouter
. It performs the parsing of the body content usingparse(_:contentType)
. We don’t expect a user to call this function directly.Declaration
Swift
public func handle(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void) throws
Parameters
request
The
RouterRequest
object used to work with the incoming HTTP request.response
The
RouterResponse
object used to respond to the HTTP request.next
The closure called to invoke the next handler or middleware associated with the request.
-
This function is called by the Kitura
Router
when an incoming request matches the route provided when the BodyParser was registered with theRouter
. Themiddleware.handle(...)
function will parse the body content of an incoming request using this function. A user can call this function directly but ordinarily won’t need to.Usage Example:
In this example, the body of the request is parsed to be of the passed in contentType.
request.body = BodyParser.parse(request, contentType: contentType)
Declaration
Swift
public class func parse(_ message: RouterRequest, contentType: String?) -> ParsedBody?
Parameters
message
Message coming from the socket.
contentType
The content type as a String.
Return Value
The parsed body.
-
Read the body data of the request.
Usage Example:
In this example, the body of the request is read into a constant (called bodyData) using an instance of
RouterRequest
(called request).let bodyData = try readBodyData(with: request)
Throws
Socket.Error if an error occurred while reading from a socket.Declaration
Swift
public class func readBodyData(with reader: RouterRequest) throws -> Data
Parameters
with
The socket reader.
Return Value
The body data associated with the request.