击中除了索引以外的任何东西时,Grails REST 404

时间:2014-08-30 21:37:53

标签: rest grails

当关注http://grails.org/doc/latest/guide/webServices.html#restfulControllers以创建RESTful Web服务时,当我点击索引以外的任何内容时,我收到404错误。

Bootstrap.groovy我有

def init = { servletContext ->
    new Restaurant(title:"mourne seafood").save()
    new Restaurant(title:"RBG").save()
}

在我的Restaurant.groovy域类中

 class Restaurant {

    String title

    static constraints = {
    }
}

在我的RestaurantController.groovy REST控制器中我有

import grails.rest.*;

class RestaurantController extends RestfulController {
    static responseFormats = ['json', 'xml']    
    RestaurantController() {
        super(Restaurant)
    }       
}

我想在阅读上面的链接时,如果我打电话 GET <domain>/restaurant 它会调用index方法,这很好,这是有效的,但是当我打电话时 GET <domain>/restaurant/1 我认为它应该将show方法称为id?但是我得到了404.当我点击GET <domain>/restaurant/show/2时,它正常工作我错误地认为当文档说出来时

映射表中的

GET /books/${id} show我不应该在URL中明确地放置show吗?

1 个答案:

答案 0 :(得分:0)

我知道这很糟糕,但现在是:

您需要创建一个通用的rest控制器并注释指向它的域类。

首先删除RestaurantController.groovy

然后创建一个BaseRestController(在src / main / groovy文件夹中)

的src /主/常规/ BaseRestController.groovy

import grails.rest.*;

class BaseRestController<T> extends RestfulController<T> {

    BaseRestController(Class<T> domainClass) {
        this(domainClass, false)
    }
    BaseRestController(Class<T> domainClass, boolean readOnly) {
        super(domainClass, readOnly)
    }

    @Override
    def show() {
        println 'showing...'
        respond queryForResource(params.id)
    }
}

聚苯乙烯。我只是覆盖索引操作以显示它的工作原理 现在您可以注释域类

的grails-app /域/ Restaurant.groovy

import grails.rest.*
@Resource(uri='/restaurants', formats=['json', 'xml'], superClass=BaseRestController)
class Restaurant {

    String title

    static constraints = {
    }
}

您需要指定域类中的格式,而不是控制器中的格式。否则它将被忽略,XML将是默认的。 我将api端点命名为 restaurants ,而不是grails默认餐厅 现在您可以为您的RestFull应用提供HTTP,例如http://localhost:8080/restaurants/1