显示导航

使用MongoDB构建REST应用程序

365bet地区本指南将演示如何使用365bet地区 GORM和MongoDB构建REST应用程序

格雷姆·罗彻(Graeme Rocher)

365bet地区版本 4.0.1

365bet地区培训

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

在本指南中,您将构建一个365bet地区365bet地区应用使用适用于MongoDB的GORM访问MongoDB并以RESTful方式生成JSON响应

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

  • 一个安装MongoDB或以上

如何完成指南

要开始,请执行以下操作

要么

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails引导休息mongodb初始

您可以直接前往如果你光盘进入grails引导其余mongodb完成

365bet地区或者,如果您已经安装了365bet地区,则可以在“终端”窗口中使用以下命令创建新的应用程序

grails创建应用程序mongodb示例配置文件rest api功能mongodb cd mongodb示例

当。。。的时候创建应用365bet地区命令完成365bet地区将创建一个mongodb示例目录,其中应用程序配置为默认情况下使用REST创建应用程序休息api配置文件并配置为使用特征

创建应用程序后,您需要启动MongoDB通常是通过MONGODB HOME本蒙哥可执行文件

sudo mongod TI CONTROL initandlisten数据库版本v TI CONTROL initandlisten git版本c daeb e dc fa ed TI CONTROL initandlisten构建信息Darwin mci osx build gen cc Darwin内核版本Sun Sep PDT根xnu RELEASE X x BOOST LIB版本TI CONTROL initandlisten分配器系统CONTROL initandlisten选项TI NETWORK initandlisten等待端口上的连接

如您所见,默认情况下,MongoDB在端口上可用27017.

编写申请

现在您可以开始编写应用程序了

配置应用程序

启动MongoDB服务器后的第一步是确保正确配置了应用程序。默认情况下,可以在以下位置找到MongoDB客户端的配置。grails应用配置会议应用yml文件

grails应用配置会议应用yml
ils:
    :
        主办本地主机港口: 27017
        #用户名: ""
        #密码: ""
        #数据库名称: "mydatabase"

该配置被设置为使用默认值,但是,如果您的MongoDB服务器需要身份验证或任何自定义配置,则可能需要更改配置.

创建域类

您可以使用创建域类从项目根目录开始的CLI命令

grailsw创建域类Product创建了grails应用程序域演示Product groovy创建了src test groovy演示ProductSpec groovy

另外,您也可以使用自己喜欢的文本编辑器或IDE创建域类

域类是一个简单的Groovy类,您可以表示MongoDB的每个属性文献使用属性例如

365bet地区应用程序域演示产品常规
演示进口 365bet地区grails编译器365bet地区CompileStatic


 产品 {
}

应用程序中定义的每个域类都将被编译以实现MongoEntity

365bet地区应用程序域演示产品常规
进口 grails mongodb

 产品 实施MongoEntity {
    ..
}

如果您想定义在GORM域类中定义的属性上,您可以使用约束属性

365bet地区应用程序域演示产品常规
静态的空白: 范围: 0.0..1000.00
}

上面的示例应用了两个约束

  • 那么属性受到限制,因此不能为空字符串

  • 属性受到限制,因此使用时必须大于或小于一千范围约束

要验证这些约束是否符合我们的预期,您可以编写测试。创建域类测试称为src测试groovy演示ProductSpec groovy已经为您生成了,否则只需在src测试使用您的IDE或文本编辑器就足够了

365bet地区365bet地区中的测试是用Spock框架测试,包括测试名称中包含空格

要使用MongoDB和Spock编写单元测试,您可以简单地从grails测试mongodb MongoSpec.

src测试groovy演示ProductSpec groovy
进口 grails测试mongodb MongoSpec
进口 免费测试gorm DomainUnitTest
进口 与github fakemongo Fongo一起
进口 与mongodb MongoClient

 产品规格 延伸MongoSpec(3)
        实施DomainUnitTest {  (4)

    覆写MongoClient创建MongoClient(2)
        Fongo getClass名称mongo虚空 '负值不是有效价格'() { (1)
        给定域名价格d

        期望域验证''])
    }

    虚空 '空白名称无法保存'() { (1)
        给定域名''

        期望域验证'那么'])
    }

    虚空 '有效域已保存'() {  (1)
        给定域名'香蕉'域名价格d

        什么时候域保存然后产品计数旧产品计数1
    }
}
1 Spock允许您定义更具可读性的
2 覆盖createMongoClient的方法MongoSpec基类使用诸如丰戈MongoDB的内存中Java实现
3 MongoSpec是一个抽象类,它将在正在执行的规范的设置阶段初始化GORM
4 使用免费测试gorm DomainUnitTest单元测试单域类的特征

将fongo依赖项添加到建立gradle

建立gradle
测试编译'与github fakemongo fongo'

现在运行测试,您可以运行gradlew检查从终端窗口中运行,或在IDE中运行测试(如果IDE支持)

gradlew检查

查看如何测试域类约束指南以了解有关测试约束的更多信息

创建一个控制器

现在定义了数据模型,是时候编写了控制器.

最快的方法是创建宁静的控制器终端窗口中的命令

grailsw创建Restful控制器演示Product创建了grails应用控制器演示ProductController groovy

但是,您也可以使用自己喜欢的文本编辑器或IDE轻松创建控制器。

控制器的内容应如下所示

365bet地区应用程序控制器演示ProductController groovy
静态编译
 产品控制器 延伸RestfulController静态的responseFormats'json', 'XML文件'产品控制器产品

RestfulController超类将实现所有必要的操作以执行常见的REST动词,例如得到, 开机自检, 如果要覆盖或禁止某些动词,则可以覆盖超类的等效方法,例如删除方法返回替代或禁止的响应

将控制器映射到URI

默认情况下,控制器将在产品URI这是由于默认grails应用配置会议演示UrlMappings groovy

grails应用程序控制器演示UrlMappings groovy
删除"/$控制者/$ID(.$格式)?"(行动: '删除'得到"/$控制者(.$格式)?"(行动: '指数'得到"/$控制者/$ID(.$格式)?"(行动: '节目'发布"/$控制者(.$格式)?"(行动: '保存'"/$控制者/$ID(.$格式)?"(行动: '更新'补丁"/$控制者/$ID(.$格式)?"(行动: '补丁')

如您在上方看到的,每个HTTP动词都被映射,从而使用URI从URI本身建立控制器名称。控制者句法

如果您希望使用其他名称或明确说明所用的URI,则可以使用资源映射

grails应用程序控制器演示UrlMappings groovy
"产品展示"(资源:"产品")

在这种情况下,控制器将被映射到产品展示代替产品.

如果您希望将其他端点添加到REST API,则只需执行相应的操作即可

例如,说您希望能够使用产品搜寻URI和查询为此,第一步是实现一个搜索控制器中的动作

365bet地区应用程序控制器演示ProductController groovy
定义 搜索(q整数最大值(1)
    如果q定义查询产品在哪里(2)那么/$q/回应查询清单: 数学最小最大10, 100)) (3)
    }
    其他响应[]) (4)
    }
}
1 一个叫搜索定义采用一个称为q还有一个参数
2 哪里使用正则表达式正则表达式执行查询以搜索产品
3 响应方法用于响应结果列表
4 对于未指定查询的情况,我们响应空列表

完成动作后,您现在需要公开产品搜寻通过在中定义适当的映射grails应用配置会议演示UrlMappings groovy:

grails应用程序控制器演示UrlMappings groovy
'产品展示'(资源: '产品'采集'搜索'(控制者: '产品', 行动: '搜索')
    }
}

采集将URI直接嵌套在下面的方法产品展示以URI为例产品搜寻而不是例如将其嵌套在资源标识符下方产品搜寻).

请参阅《 365bet地区用户指南》有关控制URI如何映射到控制器的更多信息

测试搜索端点

为该单元编写单元测试搜索您可以使用的动作创建单元测试CLI命令创建一个

grailsw创建单元测试演示ProductController

或者只是创建一个src测试groovy演示ProductControllerSpec groovy使用您喜欢的文本编辑器或IDE的文件

编写下一个单元测试

src测试groovy演示ProductControllerSpec groovy
进口 与github fakemongo Fongo一起
进口 与mongodb MongoClient
进口 grails测试mongodb MongoSpec
进口 365bet地区测试Web控制器ControllerUnitTest

 产品控制器规格 延伸MongoSpec(1)
        实施ControllerUnitTest {  (2)

    覆写MongoClient创建MongoClient(3)
        Fongo getClass名称mongo虚空设定(4)产品保存全部产品那么: '苹果', : 2.0),
            产品那么: '橙子', : 3.0),
            产品那么: '香蕉', : 1.0),
            产品那么: '蛋糕', : 4.0)
        )
    }
    虚空 ''() {
        什么时候: '执行查询以查找结果'控制器搜索'pp', 10)

        然后: '回答正确'响应json大小1响应json0那么'苹果'
    }
}
1 MongoSpec是一个抽象类,它将在正在执行的规范的设置阶段初始化GORM
2 覆盖createMongoClient的方法MongoSpec基类使用诸如丰戈MongoDB的内存中Java实现
3 使用365bet地区测试Web控制器ControllerUnitTest单元测试控制器的特征
4 设定方法使用保存全部保存多个域类以用作测试数据的方法

该测试通过执行搜索方法传递适当的参数并验证写入响应中的JSON测试会声明json的属性365bet地区呈现的结果JSON看起来像

[{"ID":1,"那么":"苹果","":2.0}]

让我们看一下如何自定义此JSON

自定义JSON输出

365bet地区的用途JSON视图表示呈现JSON响应的想法是继续将控制器逻辑与视图逻辑分离的理念

如果未找到特定视图,则呈现默认视图365bet地区应用程序视图对象对象gson:

365bet地区应用程序视图对象对象gson
进口 常规变换

领域 宾语对象json g渲染对象

默认值对象格森视图只是使用g呈现自动产生对象的JSON表示形式的方法

如果您想更改JSON的输出,那么在365bet地区中完成的方法是创建一个视图。您可以使用产生意见CLI的命令

grailsw生成视图演示产品渲染模板索引gson到目标grails应用程序视图产品索引gson渲染模板显示gson到目标grails应用程序视图产品显示gson渲染模板域gson到目标grails应用程序视图产品产品gson

如您所见,模板已生成

  • grails应用查看产品索引gson当通常通过GO呈现来自GORM的结果列表的集合时,将使用此视图。响应控制器中的方法

  • grails应用程序浏览量产品显示gson当单个产品实例通过响应控制器中的方法

  • grails应用程序浏览量产品产品gson这是双方使用的模板吉森指数显示gson实际显示数据的视图

的内容产品gson默认情况下看起来像

grails应用程序浏览量产品产品gson
进口 演示产品型号产品产品json g渲染产品

致电g渲染产品输出所有属性

然而jsonproperty是Groovy的一个实例流JsonBuilder您可以根据需要使用它来更改输出

grails应用程序浏览量产品产品gson
进口 演示产品型号产品产品货币货币地区国家货币getInstance语言环境货币getInstance'美元'json id产品ID名称产品名称价格"${货币符号}${产品价格}"
}

在这个简单的示例中,我们根据用户的语言环境输出货币符号,现在生成的JSON看起来像

[{一世d:1,"那么":"苹果","":"$2.0"}]
JSON Views非常灵活,有关根据您的需求定制输出的更多信息,请参见文档.

运行应用程序

要运行该应用程序,请使用gradlew bootRun命令将在端口上启动应用程序

使用POST创建数据

应用程序启动后,您可以创建一个产品使用您的首选HTTP客户端的实例。在以下示例中,我们将使用卷曲.

提交开机自检请求在终端窗口中使用以下内容

curl i H内容类型应用程序json X POST本地产品d名称橙色价格

结果输出将是

HTTP X应用程序上下文应用程序开发位置http localhost产品内容类型应用程序json字符集UTF传输编码编码日期日期星期三十一月GMT名称橙色价格

如您所见,返回了HTTP状态代码

使用GET读取数据

您可以阅读所有产品实例使用得到请求

卷曲我本地主机产品

或只读取一个实例ID:

卷曲我本地主机产品

哪个会回来

HTTP X应用程序上下文应用程序开发内容类型应用程序json字符集UTF传输编码分组日期日期星期三十一月GMT id名称橙色价格

使用PUT更新数据

要更新数据,您可以使用您要更改的ID和URI及数据中的请求

curl i H内容类型应用程序json X PUT本地主机产品d价格

在这种情况下,结果输出将是

HTTP X应用程序上下文应用程序开发位置http localhost产品内容类型应用程序json字符集UTF传输编码编码日期日期星期三十一月GMT id名称橙色价格

如果您尝试使用无效值更新数据

curl i H内容类型应用程序json X PUT本地主机产品d价格

然后将收到错误响应

HTTP X应用程序上下文应用程序开发位置http本地主机产品内容类型应用程序json字符集UTF传输编码块化日期日期十一月GMT消息类类演示的属性价格含值的产品不在有效范围内,从到路径链接自href http本地主机产品
错误响应由365bet地区应用程序查看错误gson视图,并且从位于以下位置的消息束中获取消息365bet地区应用程式n

使用DELETE删除数据

删除一个产品只需发送一个请求

卷曲我X删除本地主机产品

如果删除实例成功,则输出为

HTTP X应用程序上下文应用程序开发内容类型应用程序json字符集UTF日期星期三十一月GMT

365bet地区恭喜,您已经使用365bet地区 GORM和MongoDB构建了第一个REST应用程序

请记住,您可以使用右侧的链接获取完整示例的源代码。

您需要365bet地区帮助吗

OCI赞助了本指南的创建OCI提供了几种365bet地区服务:

免费咨询

OCI 365bet地区团队包括365bet地区联合创始人Jeff Scott Brown和Graeme Rocher检查我们的365bet地区课程并向发展和维护365bet地区的工程师学习

Grails OCI团队