Vapor如何为单个路由配置请求体大小并解决413报错问题
Vapor修改特定路由最大请求体大小避错方案
1. 初始Type '()' cannot conform to 'ResponseEncodable'报错原因
该报错是因为路由闭包没有返回符合ResponseEncodable协议的响应内容。你最开始的示例代码里仅写了// 处理请求的注释,闭包最终返回的是空值(),不符合Vapor路由的返回要求,补全符合要求的返回逻辑即可解决该问题。
2. 配置后仍触发413 Payload Too Large的原因
你现在的代码存在同路径路由重复注册的问题:
- 你先调用
try app.register(collection: ListingController())注册了路由组,在Controller的boot方法中已经注册了POST /api/listings路由,该路由使用默认的最大请求体大小(默认16kb) - 后续再通过
app.on注册同路径、带10mb限制的同方法路由时,请求会优先匹配先注册的默认大小路由,因此自定义的大小配置不生效
3. 正确实现方案
推荐直接在RouteCollection内部注册路由时配置请求体大小,避免重复注册:
struct ListingController: RouteCollection { func boot(routes: RoutesBuilder) throws { let listingRoutes = routes.grouped("api", "listings") // 注册路由时指定body配置,设置最大10mb请求体 listingRoutes.post(.init(body: .collect(maxSize: "10mb")), use: ListingController.post) } static func post(request: Request) throws -> EventLoopFuture<List> { // 注意参数名要和使用的变量名统一,这里参数是request,后续调用也要用request let data = try request.content.decode(CreateListData.self) let list = try List(list: data.list) return list.save(on: request.db).map { list } } }
然后删掉routes方法中重复注册的app.on(.POST, "api/listings", body: .collect(maxSize: "10mb"), use: ListingController.post)这行代码即可。
补充可选方案
如果需要全局修改所有路由的默认最大请求体大小,可以在configure方法中添加如下配置:
// 全局默认最大请求体设为10mb app.routes.defaultMaxBodySize = "10mb"
内容的提问来源于stack exchange,提问作者Wendell
相关产品推荐
相关产品推荐

