本篇继续在前一篇的基础上实现
之前实现了链式动作简单用法,本篇实现一个稍微复杂点的链式动作。
一、修改控制器源码
1.编辑src/books.h并修改以下方法:
class Books
{
public:
/**
* Create a book with the supplied title, rating, and author
*/
// C_ATTR(url_create, :Local :Args(3))
// C_ATTR(url_create, :Chained("/") :PathPart("books/url_create") :Args(3))
C_ATTR(url_create, :Chained("base") :PathPart("url_create") :Args(3))
void url_create(Context *c, const QString &title, const QString &rating, const QString &authorId);
/**
* Can place common logic to start chained dispatch here
*/
C_ATTR(base, :Chained("/") :PathPart("books") :CaptureArgs(0))
void base(Context *c);
}
更新一下我们最初的链接 *** 作,先执行下面的base()函数,执行完成后,再执行url_create函数
我们分析下过程:
完整的url请求为http://localhost:3000/books/url_create/TCPIP_Illustrated_Vol-2/5/4
(1)启动链先配置成功"/"
(2)通过CaptureArgs()或AutoCaptureArgs获取参数
(3)根据PathPart()参数匹配的路径"books",应该执行base()函数
(4)执行base()函数
(5)根据启动参数base,链接到链的前一部分
(6)使用“Args()”或AutoArgs来结束链(不要通过“CaptureArgs()”获取参数)
(7)根据PathPart()参数匹配的路径"books",应该执行url_create()函数
(8)执行url_create()函数
2.编辑src/books.cpp,以实现base()方法
void Books::base(Context *c)
{
// Print a message to the debug log
qDebug("*** INSIDE BASE METHOD ***");
}
二、编译并测试
直接编译,生成动态库,并运行服务,输出如下
可以看到“已加载的链接 *** 作”部分将略有更改:
“Path Spec”是相同的,但现在它映射到两个我们预期的私有 *** 作。
base方法由URL的/books部分触发。
然而,处理将继续进行到url_create方法,因为该方法“链接”在base之外,并指定:PathPart(“url_create”)(请注意,我们可以在这里省略“PathPart”,因为它与方法的名称匹配,但我们将包含它以使逻辑尽可能明确)。
在浏览器中访问http://localhost:3000/books/url_create/TCPIP_Illustrated_Vol-2/5/4
运行如下所示
点击Home,可以看到又多了一行数据
命令下输出如下
从日志可以看到,先执行了base()方法,再执行的 url_create()方法
本测试源码下载
后记:笔者第一次没搞明白是怎么回事,但运行了下源码就明白了,也希望小伙伴多动手练习下
下一篇,笔者仍然探究通过表单提交参数相关
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)