【问题标题】:Grails send request as JSON and parse it in controllerGrails 以 JSON 格式发送请求并在控制器中解析它
【发布时间】: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 集合是否已填充?

标签: json grails request grails-2.0


【解决方案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 中,您可能必须选择“自定义标头”。我不记得了)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-04
      • 2017-03-22
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多