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

时间:2012-11-07 12:58:12

标签: json grails request grails-2.0

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

{"param1":"val1"}

我想解析此请求并获取“param1”值。我使用了request.JSON,但仍然是null。还有其他方法可以解决这个问题吗?

谢谢,

3 个答案:

答案 0 :(得分:4)

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

为你的控制器写一个单元测试(不需要启动服务器):

void testConsume() {
     request.json = '{param1: "val1"}'
 controller.consume()       
 assert response.text == "val1"
}

让我们说你的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:

@XmlRootElement
public class Foo {
    @XmlElement(name = "param1")
    String param1;

    public Foo(String val){param1 = val;}      
}

以下是有关如何将Jersey客户端用于各种REST请求的更多示例: https://github.com/tavibolog/TodaySoftMag/blob/master/src/test/java/com/todaysoftmag/examples/rest/BookServiceTest.java

答案 1 :(得分:2)

在你的UrlMappings中设置如下:

static mappings = {
    "/rest/myAction" (controller: "myController", action: "myAction", parseRequest: true)
}

latest Grails guide中搜索parseRequest。

然后使用curl验证它是否正常工作:

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

答案 2 :(得分:0)

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

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

grails.mime.file.extensions = false
grails.mime.use.accept.header = false

在该文件中,检查grails.mime.types。确保它包含json: ['application/json', 'text/json'],它可能会包含*/*,但会将其置于content-type之上。这些条目按顺序进行评估(这在前2.1版本中是正确的,还没有'现在验证它,但是到底是什么)。与此相关,正如提到的aiolos,将{{1}}标头设置为上述mime类型之一。

最后,根据TomaszKalkosiński进行curl测试,或者使用RESTClient for FF,单击客户端页面顶部的“Headers”(左上角有4个可点击项;标题为1。从新的RESTClient,您可能必须选择“自定义标题”。我不记得了)