显示导航

学习配置路由和端点

s扎卡里·克莱因(Zachary Klein)

365bet地区版本 4.0.1

入门

365bet地区无论是构建传统的基于页面的应用程序,单页应用程序还是具有逻辑可扩展API的微服务都是应用程序设计中非常重要的部分。365bet地区为构建具有以下功能的API提供了强大的支持:.

我们将要构建的示例应用程序将是一个会议调度应用程序,名为议程我们将有一个简单的领域模型,包括讲者, 会谈一个议程将演讲者和演讲以及会议其中有一个议程我们将在本指南中创建域模型,但现在将创建位于其上方的Web层

您将需要什么

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

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

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

如何完成指南

要开始,请执行以下操作

要么

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

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

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

要完成指南,请转到初始

  • 光盘进入grails指南grails url映射初始

并按照下一节中的说明进行操作

您可以直接前往完成的例子如果你光盘进入grails指南grails url映射完成

创建我们的应用程序

请从以下选项中选择以创建您的项目

365bet地区通过365bet地区 CLI创建新的应用程序

365bet地区如果安装了365bet地区,则可以在命令行上创建应用程序

grails创建应用程序议程

通过Application Forge创建一个新的应用程序

您可以从下载项目http start grails org通过使用在线向导或以下卷曲命令

curl O start grails组织议程zip d版本

使用指南存储库中的初始项目

在指南目录中复制初始项目到您选择的目录,将其重命名议程并按照该项目中的指南进行操作

创建控制器

在定义URL映射之前,我们需要创建一些控制器您可以将它们视为我们应用程序的Web层控制器响应来自用户浏览器或另一个微服务的请求,即从模型中获取数据并返回诸如HTML页面或JSON字符串之类的响应

您可以通过在以下代码下简单地创建Groovy类来创建控制器365bet地区应用程序控制器365bet地区目录但是365bet地区提供了一个方便的命令,用于在命令行上创建控制器

因为我们要创建几个控制器,所以我们使用互动模式365bet地区365bet地区 CLI提供的从项目目录中运行以下命令

grailsw

365bet地区加载交互式CLI后,您可以运行任何可用的365bet地区命令,包括创建控制器运行以下命令

grails创建控制器演示对话grails创建控制器演示演讲者grails创建控制器演示议程grails创建控制器演示会议

365bet地区前进并退出365bet地区 CLI

365bet地区出口

现在我们有了控制器,是时候创建了行动无论是人类还是我们的API动作的客户端,这些都将作为我们应用程序用户的端点公开,它们只是在控制器类中定义的方法。RAW创建R ead U pdate删除控制器,通常需要执行如下所示的操作

 CrudController {

    定义 指数() {} 通常是列表视图

    定义 保存() {} 保存新记录

    定义 节目(可序列化ID检索特定记录的详细信息

    定义 更新(可序列化ID更新特定记录

    定义 删除(可序列化ID删除特定记录
}

如果这是一个休息控制器,上述操作对于CRUD操作可能就足够了。如果我们还想显示HTML表单以用于编辑和创建记录,我们也可以添加创建编辑显示这些页面的动作

让我们为将来的域模型存根CRUD操作编辑前三个控制器TalkController, 扬声器控制器议程控制器如下所示

365bet地区应用程序控制器演示TalkController groovy
演示 TalkController {

    定义 指数渲染"检索所有对话"
    }

    定义 保存渲染"保存新对话"
    }

    定义 节目(longid渲染"检索对话${ID}..."
    }

    定义 更新(longid渲染"更新谈话${ID}..."
    }

    定义 删除(longid渲染"删除对话${ID}..."
    }
}
365bet地区应用控制器演示SpeakerController groovy
演示 扬声器控制器 {

    定义 指数渲染"检索所有发言人"
    }

    定义 保存渲染"保存新的演讲者"
    }

    定义 节目(longid渲染"检索发言人${ID}..."
    }

    定义 更新(longid渲染"更新扬声器${ID}..."
    }

    定义 删除(longid渲染"删除扬声器${ID}..."
    }
}
grails应用程序控制器演示AgendaController groovy
演示 议程控制器 {

    定义 指数渲染"检索所有议程"
    }

    定义 保存渲染"保存新议程"
    }

    定义 节目(longid渲染"检索议程${ID}..."
    }

    定义 更新(longid渲染"更新议程${ID}..."
    }

    定义 删除(longid渲染"删除议程${ID}..."
    }
}

为了会议控制器我们将创建一组不同的操作会谈, 讲者议程除此之外会谈讲者操作将接受可选ID参数,以便我们可以显示特定的发言人或讲话

编辑ConferenceController常规如下所示

365bet地区应用程序控制器演示ConferenceController groovy
演示 会议控制器 {

    定义 会谈(longID如果id渲染"返回会议谈话${ID}..."
        } 其他渲染"返回会议演讲"
        }

    }

    定义 讲者(longID如果id渲染"回国会议发言人${ID}..."
        } 其他渲染"返回会议发言人"
        }
    }

    定义 议程渲染"返回会议议程"
    }
}

365bet地区现在,我们已经取消了控制器操作,让我们来看看365bet地区 URL映射为我们提供了什么

定义URL映射

让我们看一下默认UrlMappings常规文件下365bet地区应用控制器演示):

演示 网址映射 {

    静态的映射"/$控制者/$行动?/$ID?(.$格式)?"约束在此处应用约束
            }
        }

        "/"(视图:"指数")
        "500"(视图:'错误')
        "404"(视图:'未找到')
    }
}

中的第一个映射映射块非常简单。它包含两个部分:一个字符串,用于定义URL模式;一个闭包,其中的选项如约束可以指定以更改映射的行为

了解如何使用URL约束365bet地区在365bet地区文档中.

URL模式可以包括在模式e g中用Groovy字符串表示的变量控制者要么控制者365bet地区365bet地区开箱即用地支持一些特殊的通配符,例如控制者将被映射到给定控制器的名称行动将被映射到该控制器内的一个动作,依此类推。可选变量的后缀为?是先生控制器动作

在网址格式的所有部分使用变量意味着该特定映射将匹配任何URL见下表

表URL映射分辨率
网址 结果

脱口秀

TalkController, 节目行动ID的参数1

谈论

TalkController默认动作通常是索引动作

演讲者秀json

扬声器控制器, 节目行动ID的参数1, 格式的参数json可用于内容协商

除了映射到控制器动作之外,URL映射还可以直接映射到视图,而无需指定用于重定向的控制器或动作或任意URI,例如,根上下文的默认URL映射/指向默认索引gsp下页grails应用程序视图:

    "/"(视图:"指数")

您可以使用小号映射到其他URI的参数

    "你好"(小号: "你好派遣")

另一种有用的映射是HTTP错误代码映射,默认情况下也可以看到UrlMappings常规文件默认映射仅加载默认错误视图,但是您可以轻松地将这些请求重定向到错误处理或日志记录控制器,以在应用程序中应用自定义错误处理逻辑和恢复。

控制器myErrorController操作somethingBroke控制器myErrorController操作notFound

默认的URL映射将满足此示例应用程序中的大多数需求。但是,为了给我们更精细的控制,我们将为该应用添加一些自己的映射会议控制器我们在上面提出的动作

默认的URL映射集涵盖了许多用例,但是,当需要保护应用程序安全时,您可能需要删除默认的映射并将其替换为更具体的映射,以使用户无法通过简单地找出名称来访问他们喜欢的任何控制器操作。

编辑UrlMappings常规文件如下图所示

grails应用程序控制器演示UrlMappings groovy
演示 网址映射 {

    静态的映射"/$控制者/$行动?/$ID?(.$格式)?"约束在此处应用约束
            }
        }

        "会谈$ID?"(控制者: '会议', 行动: '会谈') (1)

        "讲者$ID?"(控制者: '会议', 行动: '讲者')

        "议程"(控制者: '会议', 行动: '议程') (2)

        "/"(视图:"指数")
        "500"(视图:'错误')
        "404"(视图:'未找到')
    }
}
1 我们正在映射自定义网址格式会谈编号给我们会议控制器动作ID变量表示网址格式的这一部分将映射到ID的参数会谈动作的后缀?使此变量为可选
2 请注意,我们没有在此模式中使用任何变量,因此请求必须与URL模式完全匹配,否则它将由文件顶部的默认URL映射处理。

如果您现在启动应用程序并向http本地主机会谈您应该看到将此文本呈现给浏览器

返回会议演讲

尝试其他网址http本地主机会谈:

返回会议谈话

HTTP方法

在继续之前,还要注意URL映射的另外一项功能。除了指定URL模式和约束,映射还可以指定匹配映射所需的特定HTTP方法。这就像在模式之前加上所需的HTTP动词一样简单,例如得到, 发布要么.

让我们更新我们的UrlMappings常规再提交一次以指定我们仅接受得到对我们的要求会议控制器行动

grails应用程序控制器演示UrlMappings groovy
演示 网址映射 {

    静态的映射"/$控制者/$行动?/$ID?(.$格式)?"约束在此处应用约束得到"会谈$ID?"(控制者: '会议', 行动: '会谈'得到"讲者$ID?"(控制者: '会议', 行动: '讲者'得到"议程"(控制者: '会议', 行动: '议程')

        "/"(视图:"指数")
        "500"(视图:'错误')
        "404"(视图:'未找到')
    }
}

如果您现在使用卷曲或其他HTTP客户端对这些URL之一发出非GET请求,您将收到一个页面,请尝试以下操作卷曲命令

curl X PUT本地主机会谈

整理网址映射

随着时间的流逝,您的应用程序可能最终会出现许多类似的URL映射或大量特定于该应用程序一部分的映射。有几种组织URL映射的方法,包括方法以及使用多个网址映射常规档案

网址组

如果您有大量属于特定路径的映射,则可以使用指定URL模式的共享部分并分别列出每个模式的右侧部分的方法

编辑UrlMappings常规再次归档,并将我们添加的三个URL映射归为一个共享路径conf.

grails应用程序控制器演示UrlMappings groovy
演示 网址映射 {

    静态的映射//..."conf"得到"会谈$ID?"(控制者: '会议', 行动: '会谈'得到"讲者$ID?"(控制者: '会议', 行动: '讲者'得到"议程"(控制者: '会议', 行动: '议程')
        }

        //...
    }
}

如果重新启动应用程序,则可以看到现在需要这些映射conf作为网址格式E g的第一部分http localhost conf会谈

多个UrlMappings文件

365bet地区365bet地区支持多种网址映射文件唯一的要求是每个文件必须唯一地命名驻留在365bet地区应用程序控制器并且文件名必须以UrlMappings常规.

让我们创建第二个网址映射提交给我们会议控制器映射创建一个新文件,名为ConferenceUrlMappings groovy结束编辑其内容,如下所示

grails应用程序控制器演示ConferenceUrlMappings groovy
演示 ConferenceUrl映射 {

    静态的映射组"conf"得到"会谈$ID?"(控制者: '会议', 行动: '会谈'得到"讲者$ID?"(控制者: '会议', 行动: '讲者'得到"议程"(控制者: '会议', 行动: '议程')
        }
    }
}

现在删除conf原始网址映射UrlMappings常规文件,因此与以下版本匹配

grails应用程序控制器演示UrlMappings groovy
演示 网址映射 {

    静态的映射"/$控制者/$行动?/$ID?(.$格式)?"约束在此处应用约束
            }
        }

        "/"(视图:"指数")
        "500"(视图:'错误')
        "404"(视图:'未找到')
    }
}

测试URL映射

365bet地区365bet地区测试支持365bet地区建议使用库来编写大多数365bet地区工件(包括URL映射)的测试的方法。该库包含在当前版本的365bet地区中,它提供了一个UrlMappingsUnitTest特质,可以轻松测试URL映射

特质365bet地区是Groovy编程语言的强大功能,许多365bet地区功能都利用了它们。您可以创建自己的特征以及应用程序代码的一部分,请参见Groovy文档了解更多信息

让我们为我们编写一个单元测试ConferenceUrl映射在下面创建一个新的Groovy文件src测试groovy演示命名ConferenceUrlMappingsSpec groovy使用以下内容编辑文件

src测试groovy演示ConferenceUrlMappingsSpec groovy
演示进口 免费测试Web UrlMappingsUnitTest
进口 spock lang规格

 会议网址映射规范 延伸规格实施UrlMappingsUnitTest { (1)

    虚空设置模拟控制器ConferenceController(2)
    }

    虚空 "测试会议映射"() {

        期望: "会议电话会议取得成功"验证网址映射"会谈", 控制者: '会议', 行动: '会谈', 方法: '得到')  (3)验证网址映射"会谈", 控制者: '会议', 行动: '会谈', 方法: '得到'ID'1'
        }

        什么时候: "呼叫会议发言人"assertUrlMapping"会议发言人", 控制者: '会议', 行动: '讲者', 方法: '得到') (4)

        然后: "没有异常被抛出"noExceptionThrown
1 我们的测试是标准的Spock规格然后实施UrlMappingsUnitTest测试支持库提供的特征请注意,特征接受一个泛型,这是我们希望在这种情况下测试的URL映射类。ConferenceUrl映射
2 测试库提供了模拟助手,例如模拟控制器连接控制器实例进行测试
3 UrlMappingsUnitTest特质提供了几种测试方法,包括验证网址映射如果URL映射与预期的控制器操作匹配,则仅返回true或false
4 另一种测试方法是assertUrlMapping执行的检查与验证网址映射但是它允许您将方法用作断言的一部分,例如Spock什么时候/然后

结论

此时,您应该对URL映射的概念感到满意,并且对最重要的功能有了很好的了解。您可以从365bet地区365bet地区文档包含命名空间RESTful的资源映射约束通配符.

帮助365bet地区

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

免费咨询

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

Grails OCI团队