如何创建接受InputStream作为参数的API?

时间:2014-06-29 13:57:50

标签: java rest grails inputstream

我的grails 2.2.4 app需要支持从第三方应用程序通过HTTP接受文件,并在对其进行一些调整后发送文件作为对第三方应用程序的响应。

我想使用InputStream将第三方应用程序发送的数据转换为文件,然后使用OutputStream

将文件发回

所以我构建了这段代码:

API类

class ApiResponse {
    ApiMeta meta
    ApiObject apiObj
}
class ApiMeta {
    int code
    String errorType
    List msgs = []
}
class ApiObject {
    OutputStream os
}

//对象Marshaller

    JSON.registerObjectMarshaller( ApiObject ) { ApiObject obj ->

            //How can I send output stream as json?
    }

控制器

//controller
def save() {
    request.withFormat {
        json {
            ApiResponse resp
            //How can I convert the JSON data in params to a file?

            response.status = 201
            resp = new ApiResponse(
                   meta: new ApiMeta(code: 201), 
                   apiObj: new ApiObject(os: transfers))

            render resp as JSON
        }
     multipartForm {
     }
  }

问题

  • 如何将第三方服务发送的JSON有效负载转换为文件?
  • OutputStream放入ApiObject类是否可以,以便将JSON有效负载发送回服务?

1 个答案:

答案 0 :(得分:0)

  

我的grails 2.2.4 app需要支持通过HTTP接受InputStream   来自第三方应用程序并发送OutputStream作为响应   回来。

这没有多大意义。第三方应用无法真正向您的应用发送InputStream,您的应用无法真正发送OutputStream。第三方应用程序可以在请求正文中向您发送数据,您可以通过从请求中检索InputStream来读取正文,并且当您将数据放入响应时也会发生同样的事情。在第一次阅读时,我想也许你只是以一种没有意义的方式写字,但是当我看到你的域名时,这表明你可能真的对这是如何运作感到困惑。

class Request {
    InputStream instream
    OutputStream outstream
    static constraints = {
        instream nullable: false, blank: false
    }
}

你不能这样做。您无法将InputStreamOutputStream保留到数据库中。

编辑:

如果您有这样的控制器:

class MyController {
    def someAction(Widget w) {
        // do whatever you need to do with the Widget
    }
}

class Widget {
    String name
    String category
}

然后使用看起来像这样的JSON正文向该控制器操作发送请求...

{"name":"Robert","category":"Prog Rocker"}

Grails将自动读取请求的正文并执行相应的绑定。您永远不必直接与任何输入流交互以实现这一点。那是你要找的东西吗?