MVC 中间件
MVC 中间件用于处理基于控制器和视图的请求分发,是实现 Web API 和页面渲染的核心组件。
注册mvc中间件
cangjie
import std.reflect.*
import demo.controllers.*
main(): Int64 {
let builder = WebHost.createBuilder()
// 注册控制器(会自动注册路由服务)
builder.services.addControllers()
.addApplicationPart(PackageInfo.get("demo.controllers"))
let app = builder.build()
app.mapControllers()
app.run()
return 0
}编写Controller
cangjie
@Route["api/[controller]"]
public class HelloController <: Controller {
// 依赖注入
public HelloController(let logger: ILogger<HelloController>) {
}
// FromServices: 从容器中绑定
@HttpGet
public func hello(@FromServices configuration: IConfiguration) {
return "hello"
}
@HttpGet["{id}"]
public func getByid(@FromRoute id: Int64) {
return "success"
}
//@FromBody是默认的,可以缺省
@HttpPost
public func post(@FromBody model: HelloModel) {
return "success"
}
@HttpDelete["{id}"]
public func delete(@FromRoute id: Int64) {
return "success"
}
@HttpGet["list"]
@HttpPost["list"]
public func getList() {
let list = ArrayList<HelloModel>()
list.add(HelloModel(1, "spire", 1))
return json(list.toArray())
}
}
// 我们提供了序列化的宏
@Serialization
public class HelloModel {
private var _id: ?Int64 = None
private var _name: String = String.empty
private var _age: Int64 = 0
public init(id: ?Int64, name: String, age: Int64) {
this._id = id
this._name = name
this._age = age
}
}- 我们内置了两个路由常量
[controller]和[action]运行时会替换为对应的控制名和动作名 - 如果路径以
/开头那么将忽略路由模板从根路径开始定义。
配置选项
ApiBehaviorOptions
配置模型验证失败的响应内容
cangjie
builder.services.configure<ApiBehaviorOptions> { configureOptions =>
configureOptions.invalidModelStateResponseFactory = {
context => ContentResult("参数不合法", 400)
}
}MvcOptions
cangjie
builder.services.addControllers()
.addMvcOptions { options =>
// 设置日期格式
options.jsonSerializerOptions.dateFormatString = "yyyy-MM-dd HH:mm:ss"
// 允许前端,提供字符串格式的数字
options.jsonSerializerOptions.numberHandling = JsonNumberHandling.AllowReadingFromString
}
.addApplicationPart("demo.controllers")