专栏首页LIN_ZONE使用Golang 封装一个Api框架----请求处理篇

使用Golang 封装一个Api框架----请求处理篇

前言:此框架的请求处理主要是依赖于Golang中的net/http包

http.ListenAndServe 方法的使用

实现http简单服务示例:参考文档 https://studygolang.com/pkgdoc

示例1 http.Handle("/foo", fooHandler) http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) }) log.Fatal(http.ListenAndServe(":8080", nil))

  1. 示例2: s := &http.Server{ Addr: ":8080", Handler: myHandler, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, MaxHeaderBytes: 1 << 20, } log.Fatal(s.ListenAndServe())

  1. 本框架的处理思路:
    1. 从http包看,http.ListenAndServe(":8080", nil) 这个方法的第二个参数是http.Handler对象,而这个对象是一个接口,所以要实现ServeHttp方法 type Handler interface { ServeHTTP(ResponseWriter, *Request) }
    2. 在core包下面声明了一个Application对象,这个对象实现了 ServeHTTP 方法,在这个方法里面进行路由的判断,然后根据取到的路由找到 控制器和对应的方法,最后在协程里面利用反射调用 对用的控制器的相应的方法从而得到调用方法的结果(这个结果指的是方法调用成功或者失败之类的结果)。在执行调用方法的过程中,http请求的参数通过 ServeHTTP的 *Request对象获取,http的响应的结果可以通过 fmt.Fprint(ResponseWriter对象, "响应结果字符串")。 注:关于请求参数的获取以及响应结果的返回,在之后的博客中会详细讲到。
    3. 框架入口:public包中的main.go func main() { routers := route.GetRouter() controllers := route.GetControllers() app := new(core.Application) app.Routers = routers app.Controllers = controllers err := http.ListenAndServe("localhost:8080", app) if err != nil { log.Println("ListenAndServe: ", err) } } } 在这个方法中首先 初始化一个Application对象,然后获取用户注册的路由及控制器,将其作为app对象的属性赋给app对象,然后使用http.ListenAndServe("localhost:8080", app) 。当请求过来的时候就会直接到app的ServeHTTP方法中,然后就会顺着 2 的思路执行。
  2. 其他处理
    1. 路由的处理 在这个框架中路由如下: package route import "goweb/controller" var routers = map[string]string{ // 示例 请求类型@控制器@方法 "/test": "get@TestController@Test", } var controllers = map[string]interface{}{ // 示例 反射中用到 "TestController": &controller.TestController{}, } func GetRouter() map[string]string { return routers } func GetControllers() map[string]interface{} { return controllers } 在1.2.3 中提到了这个框架的路由的使用时 赋值给app对象了,然后再app中进行路由处理。通过routers数组可以获取路由和控制器、方法之间的关系,通过controllers数组获取到对应的控制器的结构体的地址,然后通过反射机制调用对应的控制器的对应方法
    2. 利用反射调用方法 // 反射调用方法 func CallFuncByName(myClass interface{}, funcName string, params ...interface{}) (out []reflect.Value, err error) { myClassValue := reflect.ValueOf(myClass) m := myClassValue.MethodByName(funcName) if !m.IsValid() { return make([]reflect.Value, 0), fmt.Errorf("Method not found \"%s\"", funcName) } in := make([]reflect.Value, len(params)) for i, param := range params { in[i] = reflect.ValueOf(param) } out = m.Call(in) return out, nil } 反射一般用在知道对象及方法名称,想要得到对象的类或者调用对象的方法的情况。在MVC框架中(根据解析到的路由,动态执行方法)用得比较多一些。

注:1. 本文涉及到的代码的git仓库地址:https://github.com/zhuchenglin/goweb

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • css 控制文字超出部分显示省略号

    该文章转自:http://www.daqianduan.com/6179.html

    lin_zone
  • 支持多文件上传,预览,拖拽,基于bootstrap的上传插件fileinput 的ajax异步上传(转载)

    <link href="__PUBLIC__/CSS/bootstrap.css" rel="stylesheet">

    lin_zone
  • js 画布与图片的相互转化(canvas与img)

    //将图片对象转化为画布,返回画布 function ImageToCanvas(image) { var canvas = document.createE...

    lin_zone
  • scrapy设置代理ip

    版权信息所有者:chenjiabing 如若转载请标明出处:chenjiabing666.github.io6

    爱撒谎的男孩
  • nodejs的事件处理机制

    类似于javascript客户端代码中存在由元素触发的事件机制,在nodejs中,也有由对象触发的事件处理机制,比如http.Server对象,就可能会触发'接...

    前端_AWhile
  • OpenSSL空指针引用do_ssl3_write

    我们的UC – KEEL工具发现do_ssl3_write一个空指针引用错误(ssl/s3_pkt.c)用于提醒挂起SSL_MODE_RELEASE_BUFFE...

    FB客服
  • 深度学习数据集(一)

    海量数据(又称大数据)已经成为各大互联网企业面临的最大问题,如何处理海量数据,提供更好的解决方案,是目前相当热门的一个话题。类似MapReduce、 Hadoo...

    深度学习思考者
  • 深度学习数据集(二)

    本文整理里一些科研中可能会需要的某类数据集,需要的自己带走。 视频人体姿态数据集 1. Weizmann 人体行为库 此数据库一共包括90段视频,这些视频分别是...

    深度学习思考者
  • 数据挖掘的数据集资源

    UCI数据集是一个常用的标准测试数据集,下载地址在 http://www.ics.uci.edu/~mlearn/MLRepository.html 整理好...

    钱塘数据
  • Prometheus 整合 AlertManager

    Alertmanager 主要用于接收 Prometheus 发送的告警信息,它很容易做到告警信息的去重,降噪,分组,策略路由,是一款前卫的告警通知系统。它支持...

    程序员果果

扫码关注云+社区

领取腾讯云代金券