我有一个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])
}
}
问题
save
操作curl
例如我通常
curl -XPOST http://<domain>/app/rest/colors -d '{
"name": "red",
"shade": "light"
}'
但是现在我想发送一个文件以及这两个参数
答案 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')