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 格式发送请求并在控制器中解析它的主要内容,如果未能解决你的问题,请参考以下文章