Grails将请求作为JSON发送,并在控制器中解析它

Grails将请求作为JSON发送,并在控制器中解析它,json,grails,request,grails-2.0,Json,Grails,Request,Grails 2.0,我想以JSON的形式发送一个请求,在我的控制器中,我想解析这个JSON并获得我想要的参数。例如,这是请求: {"param1":"val1"} 我想解析这个请求并获取“param1”值。我使用了request.JSON,但仍然得到null。还有别的办法解决这个问题吗 谢谢,在URL映射中设置如下: static mappings = { "/rest/myAction" (controller: "myController", action: "myAction", parseRequ

我想以JSON的形式发送一个请求,在我的控制器中,我想解析这个JSON并获得我想要的参数。例如,这是请求:

{"param1":"val1"}
我想解析这个请求并获取“param1”值。我使用了request.JSON,但仍然得到null。还有别的办法解决这个问题吗


谢谢,

在URL映射中设置如下:

static mappings = {
    "/rest/myAction" (controller: "myController", action: "myAction", parseRequest: true)
}
@XmlRootElement
public class Foo {
    @XmlElement(name = "param1")
    String param1;

    public Foo(String val){param1 = val;}      
}
在中搜索parseRequest

然后验证它是否与curl一起正常工作:

curl --data '{"param1":"value1"}' --header "Content-Type: application/json" http://yourhost:8080/rest/myAction

在控制器方法中,选中
request.format
。它应该指定
json
。我猜它不会在这里出现,但它可能会为您提供有关如何解释有效负载的线索

在Config.groovy文件中,我将设置以下值:

grails.mime.file.extensions = false
grails.mime.use.accept.header = false
在同一个文件中,检查您的
grails.mime.types
。确保它包含
json:['application/json','text/json']
,它可能会这样做,但要把它放在
*/*
上面。这些条目是按顺序计算的(在2.1之前的版本中是这样的,现在还没有验证过,但见鬼了)。同时,正如aiolos提到的,将
内容类型
头设置为上述mime类型之一


最后,根据Tomasz Kalkosiński使用curl进行测试,或者,要使用RESTClient for FF,请单击客户端页面顶部的“标题”(左上角有4个可单击的项目;标题是一个。从新的RESTClient中,您可能必须选择“自定义标题”。我想不起来了)

您可以使用以下其中一个来测试您的内容(这两个选项最终都可以重新用作自动化测试-单元和集成):

为控制器编写单元测试,如(无需启动服务器):

假设您的controller.consume()执行以下操作:

def consume() {
    render request.JSON.param1
}
或者,您可以使用Jersey客户端对您的控制器进行调用,这次部署:

public void testRequest() {
    // init the client
    ClientConfig config = new DefaultClientConfig();
    Client client = Client.create(config);

    // create a resource
WebResource service = client.resource(UriBuilder.fromUri("your request url").build());
    // set content type and do a POST, which will accept a text/plain response as well
    service.type(MediaType.APPLICATION_JSON).accept(MediaType.TEXT_PLAIN).put(Foo.class, foo);
}
,其中foo是如下所示的foo:

static mappings = {
    "/rest/myAction" (controller: "myController", action: "myAction", parseRequest: true)
}
@XmlRootElement
public class Foo {
    @XmlElement(name = "param1")
    String param1;

    public Foo(String val){param1 = val;}      
}
下面是一些关于如何将Jersey客户端用于各种REST请求的更多示例:

您必须将请求的contentType设置为
application/json
,以便您的控制器将自动解析/解组发布的json。如何发送您的请求?我使用Rest客户端firefox extenstion。如何设置?在请求头中添加一行:
Content Type
值为
application/json
。我可以e该Rest客户端有一个名为Request Headers的表-将其放在那里。我的Request仍然为null。jsoni您的
params
集合是否已填充?我在映射方面没有问题。我使用“/$controller/get”(parseRequest:true){action=[get:“get”}如何使用rest clientRest客户端发送json作为参数在实现上可能有所不同。试试我展示的curl行,它是100%正确的。控制器是什么样子的?