【问题标题】:make controller return HTML or JSON depending on request type使控制器根据请求类型返回 HTML 或 JSON
【发布时间】:2014-08-26 02:58:21
【问题描述】:

我想知道 Grails 中是否有返回 HTML 或 JSON 的方法,具体取决于我是对某个操作进行 GET 还是仅通过 Ajax 调用一个操作。

例如,如果我对“控制器/动作”进行 Ajax 调用,有没有办法返回 JSON,如果我通过链接转到同一个“控制器/动作”,让它呈现 HTML 页面?还是我必须定义两个不同的动作?

【问题讨论】:

    标签: ajax grails controller action


    【解决方案1】:

    通常所有 AJAX 请求都设置了 X-Requested-With 标头。您可以检查是否设置了此标头并呈现所需的响应格式:

    if (request.getHeader('X-Requested-With')) {
        // render response as JSON
    } else {
        // render HTML page
    }
    

    或者(正如 Martin Hauner 在 cmets 中指出的那样)使用基本相同的 request.xhr 属性,如果当前请求是 AJAX,则返回 true:

    if (request.xhr) {
        // render response as JSON
    } else {
        // render HTML page
    }
    

    request 是一个代表当前请求的对象。 Read more about it in Grails documentation.

    【讨论】:

    • 我们可以使用request.xhr来检查ajax请求:grails.org/doc/latest/ref/Servlet%20API/request.html
    • @MartinHauner:感谢您的指出!我已经更新了我的答案。实际上很高兴了解xhr 属性,因为直到现在我一直在检查标题:)
    • +1 给 Pawel & Martin 和 +1 给 Marcos 的 Ques,这行得通..谢谢我在尝试类似的东西。
    • 谢谢你们!我还不能给出任何分数,但很高兴知道有两种方法可以做到这一点!
    • @Marcos:我很高兴它有帮助。如果有帮助,您可能会接受我的回答:)
    【解决方案2】:

    withFormat builder 随时为您提供帮助:

    class BookController {
    
      def list() {
        def books = Book.list()
    
        withFormat {
            html bookList:books
            js { render books as JSON }
            xml { render books as XML }
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

      是的,有可能,

      如果你在控制器中定义

      if(isset($_post) || isset(#_get)){
      //if something is posted then this should execute
      }
      else
      {
      //this portion should execute..
      }
      

      这是一个粗略的代码,可能有一些错误,但你明白了..

      您的 Ajax 调用将根据类型发布数据 type:"POST" 或 type:"GET" 在你的 Ajax.. 你可以进入控制器。如果控制器看到有东西张贴然后控制器将采取相应的行动。 或者如果没有发布您要查找的内容,让控制器发送 HTML 代码。

      【讨论】:

      • 好的,有没有办法在 grails 中做到这一点?我的意思是,我已经看到有一个响应方法,但我根本不明白。 (对不起我的英语不好)
      猜你喜欢
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多