Grails 以 JSON 格式发送请求并在控制器中解析它

Posted

技术标签:

【中文标题】Grails 以 JSON 格式发送请求并在控制器中解析它【英文标题】:Grails send request as JSON and parse it in controller 【发布时间】:2012-10-27 13:00:31 【问题描述】:

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

"param1":"val1"

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

谢谢,

【问题讨论】:

您必须将请求的 contentType 设置为 application/json,以便您的控制器自动解析/解组发布的 JSON。您如何发送请求? 我使用 Rest Client Firefox 扩展。如何设置? 在请求头中添加一行:Content-Type,值为application/json。我可以看到 Rest Client 有一个名为 Request Headers 的表 - 把它放在那里。 request.JSON 仍然为空 您的params 集合是否已填充? 【参考方案1】:

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

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

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

【讨论】:

【参考方案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

【讨论】:

我没有映射问题。我正在使用 "/$controller/get"(parseRequest:true) action = [GET:"get"] 如何使用任何其他客户端发送 json 作为参数 Rest 客户端的实现可能不同。试试我展示的卷曲线,它是 100% 正确的。 控制器长什么样子?【参考方案3】:

在控制器方法中,检查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 所提到的,将您的 content-type 标头设置为上述 mime 类型之一。

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

【讨论】:

以上是关于Grails 以 JSON 格式发送请求并在控制器中解析它的主要内容,如果未能解决你的问题,请参考以下文章

向 Grails 发送日期时的 GORM 默认日期格式

如何将角度5的输入值发送到grails 3?

如何以 JSON 格式发送 POST 请求?

使用Ajax(无表单)将POST数据以JSON格式发送到Symfony2 Controller

如何压缩来自 grails 控制器的输出?

如何在 Grails 中将特定日期格式返回为 JSON?