通过apiOperation(Swagger和Scalatra 2.6)进行文件上传和声明

时间:2019-12-10 12:30:53

标签: scala swagger scalatra

现有一个使用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)
  )) {
   ...
  }

但是我无法上传文件。

我希望看到一个文件选择器按钮,但是我看到一个单行编辑字段。

(我不确定很多事情:formfile[String][FileItem],哪些特征,什么样的初始化等)

在现有代码中,我发现有人无法招摇来处理文件上传。同时,我读到Scalatra和Swagger可以做到这一点,并不是它们的所有版本都可以,但是看起来项目中使用的版本应该能够做到这一点。

我可以找到带有yml / json接口定义的代码示例,但是在项目中没有yml,只有基于apiOperation的东西。

是否有使用Scalatra 2.6,Swagger和apiOperation的有效示例?

1 个答案:

答案 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称为“注释”。