• Golang ECHO路由与控制器【2】


    一、概述

    路由是一个过程,指的是一个http请求,如何找到对应的控制器函数或者叫处理器函数。

    控制器函数主要负责执行http请求-响应任务。

    提示:根据MVC设计模式,控制器不会把所有的请求-响应任务都干了,控制只是作为一个请求的入口、起到协调(调用各个模块)的作用。例如,调用几个model对象操作数据库,然后调用视图引擎把html结果展示出来。

    一个简单的例子:

    // 路由定义post请求, url路径为:/users, 绑定saveUser控制器函数
    e.POST("/users", saveUser)
    
    // 控制器函数
    func saveUser(c echo.Context) error {
        username := c.FormValue("username")
        username := c.FormValue("username")
        
        //调用model保存数据
        
        html := 调用模板引擎渲染html页面
        //以Html页面的形式响应请求
        return c.HTML(http.StatusOK, html)
    }
    

    二、路由规则

    一条路由规则由三部分组成:

    • http请求方法
    • url路径
    • 控制器函数

    1.http请求方法

    常用的http请求方法有下面4种:

    • GET
    • POST
    • PUT
    • DELETE

    2.url路径

    echo框架,url路径有三种写法:

    • 静态url路径
    • 带路径参数的url路径
    • 带星号(*)模糊匹配参数的url路径
    // 例子1, 静态Url路径, 即不带任何参数的url路径
    /users/center
    /user/101
    /food/100
    
    // 例子2,带路径参数的url路径,url路径上面带有参数,参数由冒号(:)跟着一个字符串定义。
    // 路径参数值可以是数值,也可以是字符串
    
    //定义参数:id, 可以匹配/user/1, /user/899 /user/xiaoli 这类Url路径
    /user/:id
    
    //定义参数:id, 可以匹配/food/2, /food/100 /food/apple 这类Url路径
    /food/:id
    
    //定义参数:type和:page, 可以匹配/foods/2/1, /food/100/25 /food/apple/30 这类Url路径
    /foods/:type/:page
    
    // 例子3. 带星号(*)模糊匹配参数的url路径
    // 星号代表匹配任意路径的意思
    
    //匹配:/foods/1, /foods/200, /foods/1/20, /foods/apple/1 
    //以/foods/ 开头的所有路径都匹配
    /foods/*
    

    3.Url路径匹配顺序

    上面列出了三种Url路径的写法,那么如果项目里面三种路径都有使用,而且出现一个http请求匹配多种路径的时候,echo框架选择哪个路径?

    例如:一个http Get请求的路径为 /user/10
    
    同时匹配下面三种url路径定义:
    
    /user/10
    /user/:id
    /user/*
    

    如果出现上述,一个http请求路径匹配多个定义的url路径,echo框架按下面顺序匹配,先匹配到那个就用那个定义。

    • 匹配静态url路径
    • 匹配带路径参数的url路径
    • 匹配带星号(*)模糊匹配参数的url路径

    4.控制器函数

    控制器函数定义:

    func HandlerFunc(c echo.Context) error
    

    控制器函数接受一个上下文参数,并返回一个错误。
    可以通过上下文参数,获取http请求参数,响应http请求。

    5.路由定义例子

    //实例化echo对象。
    e := echo.New()
    	
    //定义post请求, url路径为:/users, 绑定saveUser控制器函数
    e.POST("/users", saveUser)
    
    //定义get请求,url路径为:/users/:id  (:id是参数,例如: /users/10, 会匹配这个url模式),绑定getUser控制器函数
    e.GET("/users/:id", getUser)
    
    //定义put请求
    e.PUT("/users/:id", updateUser)
    
    //定义delete请求
    e.DELETE("/users/:id", deleteUser)
    
    
    //控制器函数实现
    func saveUser(c echo.Context) error {
        ...忽略实现...
    }
    
    func getUser(c echo.Context) error {
        ...忽略实现...
    }
    
    func updateUser(c echo.Context) error {
        ...忽略实现...
    }
    
    func deleteUser(c echo.Context) error {
        ...忽略实现...
    }
    

    注意:开发中路由定义和控制器函数都写在一个go文件,不方便维护,可以上一篇项目结构,规划自己的业务模块。

  • 相关阅读:
    谬论之程序猿的眼光看世界
    phpStudy-坑爹的数据库管理器-phpMyAdmin的默认用户名和密码
    解决Delphi 2010启动时出现cannot create xxxxEditorLineEnds.ttr问题
    数据库中增加操作insert into的用法和查询select的用法
    TRichEdit怎样新增的内容到最后一行?
    BCB将RichEdit光标移到最后一行
    怎么把焦点放在RichEdit的最后一行
    Panel自动变颜色
    怎么判断pagecontrol下的TabSheet是否打开还是关闭求答案
    用Setup Factory7.0怎样打包delphi的BDE?
  • 原文地址:https://www.cnblogs.com/remixnameless/p/14318155.html
Copyright © 2020-2023  润新知