现有一个使用Scalatra(2.6)和Swagger的项目:
scalaMajorVersion = '2.12'
scalaVersion = "${scalaMajorVersion}.8"
scalatraVersion = "${scalaMajorVersion}:2.6.4"
compile "org.scalatra:scalatra-swagger_${scalatraVersion}"
我可以轻松添加一个新的终点,例如:
get ("/upload", op[String]( // op finally invokes apiOperation
name = "Test method",
params = List(
query[Long]("id" -> "ID"),
query[String]("loginName" -> "login name")
),
authorizations = List(Permission.xxxxx.name)
)) {
...
}
但是我无法上传文件。
我希望看到一个文件选择器按钮,但是我看到一个单行编辑字段。
(我不确定很多事情:form
或file
,[String]
或[FileItem]
,哪些特征,什么样的初始化等)
在现有代码中,我发现有人无法招摇来处理文件上传。同时,我读到Scalatra和Swagger可以做到这一点,并不是它们的所有版本都可以,但是看起来项目中使用的版本应该能够做到这一点。
我可以找到带有yml / json接口定义的代码示例,但是在项目中没有yml,只有基于apiOperation的东西。
是否有使用Scalatra 2.6,Swagger和apiOperation的有效示例?
答案 0 :(得分:0)
我设法获得文件选择器(文件选择器,“浏览”)按钮;没有预定义的常量(例如DataType.String
)。在我使用DataType("File")
之后,其他所有功能都可以正常工作。
https://docs.swagger.io/spec.html说:
4.3.5文件
文件(区分大小写)是一种特殊类型,用于表示文件 上传。请注意,声明名称为File的模型可能会导致 与第三方工具的各种冲突,应避免。
使用文件时,消耗字段必须为“ multipart / form-data”,并且 paramType必须为“ form”。
post ("/uploadfile", op[String]( // op finally invokes apiOperation
name = "Upload File",
params = List(
new Parameter(
`name` = "kindaName",
`description` = Some("kindaDescription2"),
`type` = DataType("File"), // <===== !!!!!!
`notes` = Some("kindaNotes"),
`paramType` = ParamType.Form, // <===== !!
`defaultValue` = None,
`allowableValues` = AllowableValues.AnyValue,
`required` = true
)
),
consumes = List("multipart/form-data"), // <===== !!
...
)) {
val file: FileItem = fileParams("kindaName") // exception if missing
println("===========")
println("file: " + file)
println("name: " + file.getName + " size:"+file.getSize+" fieldName:"+file.getFieldName+ " ContentType:"+file.getContentType+" Charset:"+file.getCharset)
println("====vvv====")
io.copy(file.getInputStream, System.out)
println("====^^^====")
val file2: Option[FileItem] = fileParams.get("file123") // None if missing, and it is missing
println("file2: " + file2)
将apiOperation
之类的PS称为“注释”。