表单Content-Type = text时,Grails表示POST缺少参数

时间:2015-01-16 10:13:24

标签: grails post controller content-type

我是第三方应用发布数据的控制器操作, 问题是POST请求参数是空的,这是由于POST Content-Type =' text'。 如果我使用Content-Type =' application / x-www-form-urlencoded'模拟(使用Chrome Rest控制台插件)相同的POST 请求参数正确填写。

如何使用Content-Type =' text'?

启用POST数据

1 个答案:

答案 0 :(得分:0)

您可以使用

访问原始POST数据
request.reader.text

据我所知(并且我可能错了)grails将不会解析此内容类型,因为它最终使用HTTPServletRequest,它只解析www-form-urlencoded,因为这是正常的方式通过HTTP传递变量值。

您可以使用grails过滤器轻松模拟您想要的行为,例如:

class TextRequestFilters {
    def filters= {
        textRequestFilter(controller: '*', action:'*') {
            before = {
                if(request.post && request.format == 'text') {
                    String postBody = request.reader.text
                    String[] variables = postBody.split('&')
                    variables.each { String variable ->
                        String[] parts = variable.split('=')
                        String key = URLDecoder.decode(parts[0], request.characterEncoding)
                        String value = URLDecoder.decode(parts[1], request.characterEncoding)
                        params[key] = value
                    }
                }
            }
        }
    }
}

注意:

您可能希望从此过滤器中排除资产请求等。

内容类型应为text/plain,因为这就是grails转换为开箱即用的文本格式,但我相信您可以在Config.groovy中进行设置。