You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:48:02