我想以 JSON 格式发送一个请求,并且在我的控制器中我想解析这个 JSON 并获取我想要的参数。例如这是请求:
{"param1":"val1"}
我想解析这个请求并获得“param1”值。我使用了 request.JSON 但仍然为空。有没有其他方法可以解决这个问题?
谢谢,
我想以 JSON 格式发送一个请求,并且在我的控制器中我想解析这个 JSON 并获取我想要的参数。例如这是请求:
{"param1":"val1"}
我想解析这个请求并获得“param1”值。我使用了 request.JSON 但仍然为空。有没有其他方法可以解决这个问题?
谢谢,
您可以使用以下方法之一来测试您的东西(这两个选项最终都可以重新用作自动化测试 - 单元和集成):
为您的控制器编写单元测试(无需启动服务器):
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
像这样在你的 UrlMappings 中设置它:
static mappings = {
"/rest/myAction" (controller: "myController", action: "myAction", parseRequest: true)
}
在最新的 Grails 指南中搜索 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 所提到的,将您的content-type
标题设置为上述 mime 类型之一。
最后,根据 Tomasz Kalkosiński 使用 curl 进行测试,或者,要使用 RESTClient for FF,单击客户端页面最顶部的“标题”(左上角有 4 个可点击的项目;标题是一个。从一个新鲜的RESTClient,您可能必须选择“自定义标题”。我不记得了)