0

我有一个 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"
}'

但现在我想连同这两个参数一起发送一个文件

4

2 回答 2

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
    }

关于客户端,它是一个简单的发布请求,您可以在此处或其他任何地方阅读

于 2013-05-09T12:43:57.333 回答
0

我试图在这里回答一个类似的问题。我认为这会有所帮助。这是在 Grails 的上下文中。

UPDATE
Content-typeheader跟踪request-body附加 JSON 的请求。然后,您可以像request.JSON在 grails中一样访问 JSON 请求正文controller

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

为了在 POST 请求中使用 JSON 有效负载发送原始文件,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`

并且可以在controlleras 中访问request.getFile('myFile')

于 2013-05-09T12:49:54.863 回答