如何实现REST API以及其他参数

时间:2013-05-09 11:58:55

标签: java api rest grails

我有一个api,可以通过这样的URI访问:

POST: http://<domain>/app/rest/colors

此帖子请求将发送一些字符串参数(即name: "red")和文件。理想情况下,我希望以JSON格式提供给API的数据,但如果没有办法将文件传递给JSON,那么我也可以使用其他格式。

目前,当我从表单帖子中获取参数时,我的控制器操作看起来像这样:

def save() {
    def colorInstance = new Color(params)
    CommonsMultipartFile file = request.getFile('filename')
    fileUploadService.upload(file)
    if (colorInstance.save(flush: true)) {
            flash.message = "Created"
            redirect(action: "list")
    }
    else {
        render(view:  "create", model: [colorInstance: colorInstance])
    }
}

问题

  • 如何将文件传递给REST API?它还可以是JSON吗?
  • 如何在save操作
  • 中访问该文件
  • 如何使用curl
  • 测试操作

例如我通常

curl -XPOST http://<domain>/app/rest/colors -d '{
       "name": "red",
       "shade": "light"
}'

但是现在我想发送一个文件以及这两个参数

2 个答案:

答案 0 :(得分:1)

如果您正在使用Jersey,那么您应该在服务器端执行:

@POST
@Path("/upload/user/{email}/")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces({MediaType.APPLICATION_JSON})
public ErrorDO uploadFile(
    @FormDataParam("file") InputStream uploadedInputStream,
    @FormDataParam("file") FormDataContentDisposition fileDetail,
    @PathParam("email") String email, @Context HttpServletRequest hsr) {

    String name=fileDetail.getFileName();
      // TODO now just read from the inputstream and do what you want with it
    }

关于客户端,它是一个简单的帖子请求,你可以阅读它here或任何其他地方

答案 1 :(得分:0)

我试图回答类似的问题here。我认为这可能会有所帮助。这是Grails的背景。

<强>更新
Content-type中的header会跟踪JSON request-body附加到其上的请求。然后,您可以使用grails request.JSON中的controller访问JSON请求正文。

curl -XPOST -H "Content-Type: application/json" -H "Accept: application/json" http://<domain>/app/rest/colors -d '{
       "name": "red",
       "shade": "light"
}'

为了使用JSON有效负载在POST请求中发送原始文件,可以将curl命令修改为

curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" http://<domain>/app/rest/colors -d '{
           "name": "red",
           "shade": "light"
    }' -F myFile=@pathTosomefile`

可以在controller中访问 request.getFile('myFile')