如何在ColdFusion 11 REST服务中访问通过文件上传(使用enctype="multipart/form-data"
)发送的元数据(表单数据)?
嘲笑一项简单的服务:
component
restpath = "test"
rest = true
{
remove void function upload(
required numeric id restargsource = "Path",
required any document restargsource = "Form",
required string title restargsource = "Form"
)
httpmethod = "POST"
restpath = "{id}/"
produces = "application/json"
{
if ( FileExists( document ) )
restSetResponse({
"status" = 201,
"content" = {
"id" = id,
"title" = title,
"size" = GetFileInfo( document ).size
}
});
else
restSetResponse({
"status" = 400,
"content" = "Nothing uploaded"
});
}
}
和一个简单的HTML文件来测试它:
<!DOCTYPE html>
<html>
<body>
<form method="post"
action="http://localhost/rest/TestService/test/1/"
enctype="multipart/form-data">
<input type="text" name="title" value="File Title" /><br />
<input type="file" name="document" /><br />
<button type="submit">Submit</button>
</form>
</body>
</html>
然后服务返回500
HTTP状态代码和JSON响应:
{"Message":"The DOCUMENT parameter to the upload function is required but was not passed in."}
检查HTTP请求标头显示两个字段都已传入,但服务未接收它们。
在HTML表单中注释掉enctype
属性(因此它使用默认编码application/x-www-form-urlencoded
),然后该服务返回400
HTTP状态代码和响应{{1} }。
如何解决这个问题?
答案 0 :(得分:1)
要彻底混淆请求数据填充FORM
变量,但即使函数参数状态为restargsource="form"
,当{{1}时,该值也不会作为参数传递给REST服务除了enctype
之外的任何其他内容。
这在Adobe Getting started with RESTful web services in ColdFusion文章中得到了证实:
表单参数:
在许多情况下,您必须处理在REST服务中在表单中输入的数据。您可以使用此数据创建新条目(
application/x-www-form-urlencoded
)或更新数据库中的现有记录(POST
)。如果您使用表单字段,请将PUT
设置为restargsource
。这将提取请求中存在的数据,并使其可用于进一步处理。此外,在将数据作为表单字段发送时,您必须将内容类型标头设置为form
。
但是,可以通过更改使用application/x-www-form-urlencoded
作为restargsource="form"
变量中明确作用域的参数的参数来解决。
所以,修改服务就像这样:
form