Mygin 实现简单Http

这篇具有很好参考价值的文章主要介绍了Mygin 实现简单Http。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇是完全参考gin的功能,自己手动实现一个类似的功能,帮助自己理解和学习gin框架。

目的

  • 简单介绍net/http库以及http.Handler接口
  • 实现简单路由请求的功能

标准库启动Web服务

先看用标准库怎样启动一个web服务

import "net/http"

func helloHandler(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("hello world"))
}
func main() {
	http.HandleFunc("/hello", helloHandler)
	http.ListenAndServe(":8088", nil)
}
设置路由

我设置了一个 /hello 的简单路由,GET请求后返回 hello world。

~ curl 127.0.0.1:8088/hello
hello world

为什么请求路由能够返回hello world,这就要从Golang的http包ListenAndServe.go中查看了。

ListenAndServe源码查看

我已经将源码上的注释翻译成了中文

// ListenAndServe监听TCP网络地址addr,然后调用
//使用处理程序处理传入连接的请求。
//被接受的连接被配置为使能TCP keepalive。
//
//处理程序通常为nil,在这种情况下使用DefaultServeMux。
//
// ListenAndServe总是返回一个非nil错误。
func ListenAndServe(addr string, handler Handler) error {
	server := &Server{Addr: addr, Handler: handler}
	return server.ListenAndServe()
}

实现Handler接口

  • http包中HandleFunc的第二个参数是什么意思?点进官方包去看。
package http

type Handler interface {
    ServeHTTP(w ResponseWriter, r *Request)
}

看到第二个参数是要实现 Handler 接口的方法,根据路由匹配交给实现对应的方法处理。

engine.go编写

基于此改造封装mygin/engine.go

package mygin

import (
	"net/http"
)

type Engine struct {
}

//ServeHTTP 方法
func (e *Engine) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	switch r.URL.Path {
	case "/":
		w.Write([]byte("success \n"))
	case "/hello":
		w.Write([]byte("hello world! \n"))
	default:
		w.Write([]byte("404 NOT FOUND" + r.URL.Path + " \n"))
	}
}

func Default() *Engine {
	return &Engine{}
}

func (e *Engine) Run(addr string) {
	err := http.ListenAndServe(addr, e)
	if err != nil {
		return
	}
}

可以看到我编写了一个engine.go文件,包含了ServeHTTP方法,也就是engine实现了http包中 Handler 接口。http.ListenAndServe第二个参数把engine对象传过去,在http在处理时,就会去调用engine中的ServeHTTP方法。

main.go中调用
package main

import "gophp/mygin"

func main() {
	engine := mygin.Default()
	engine.Run(":8088")
}

编写好上诉代码后,启动main方法

curl请求
 ~ curl 127.0.0.1:8088/hello
hello world!
 ~ curl 127.0.0.1:8088
success

看到上诉结果,代表已经实现了最核心的第一步,可以看出在Golang中,不管什么web框架,所有的请求都是在此基础上运行的。赶快动手去试试吧。文章来源地址https://www.toymoban.com/news/detail-818583.html

个人博客

到了这里,关于Mygin 实现简单Http的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微软 AI 作图上线完全免费,“奖励自己”可提升速度

    ChatGPT 的横空出世应该已经让大家意识到了 AI 的恐怖。 称不上啥都能干,但给东西它真学,学得还比你快。 最近一段时间 AI 在作图领域又一次人气暴涨。 什么小姐姐写真、突破时间线的历史古图、甚至是抽象的表情包都可能源于 AI 之手。 看着手痒想玩玩?繁琐的步骤已经

    2024年02月04日
    浏览(61)
  • 简单实现python爬虫功能(Python爬虫功能)

    这篇文章主要介绍了python实现简单爬虫功能的相关资料,感兴趣的小伙伴们可以参考一下 在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材。 我们最常规的做法就是通过鼠标右

    2024年02月07日
    浏览(43)
  • Python简单实现登录功能

    代码如下 代码讲解 1. 意思:导入时间库 2. 意思:自定义用户名 3. 意思:自定义密码 4. 意思:用户输入次数,初始为0 5. 意思:Python的while循环 6-7. 意思:记录用户输入的用户名和密码 8-15. 意思:判断用户输入的用户名和密码是否正确,如果不正确打印密码或用户名错误,然后a加1如果输入

    2024年02月11日
    浏览(33)
  • python实现简单的爬虫功能

    前言 Python是一种广泛应用于爬虫的高级编程语言,它提供了许多强大的库和框架,可以轻松地创建自己的爬虫程序。在本文中,我们将介绍如何使用Python实现简单的爬虫功能,并提供相关的代码实例。 如何实现简单的爬虫 1. 导入必要的库和模块 在编写Python爬虫时,我们需要

    2024年02月14日
    浏览(34)
  • Unity实现简单AR功能

    一、首先进入Vuforia官网:Home | Vuforia EDP,也可以直接百度,第一条就是,点击进入,注册登录。 二、点击develop进行许可管理注册,依次点击两个蓝色框框中的按钮,获取一个Key。   三、 按下图输入App名称,同意条款,确定    四、点击刚刚创建好的项目生成许可密钥,在Unity工程中

    2024年02月08日
    浏览(33)
  • 如何通过原型修改第三方类库,来实现自己的功能而不破坏类库?手写一下

    使用原型链对第三方库进行扩展或修改是JavaScript中的常见做法。这种做法的优点是可以在不修改原始库源码的情军况下增加或修改功能。但也需要小心,因为过度的修改可能会导致与原始库的不兼容,或者出现不可预料的副作用。 下面给出一个简单的例子说明如何通过原型

    2024年02月10日
    浏览(26)
  • 微信小程序:简单实现地图导航功能实现

    里面的小图片需要自己找,真机调试时,点击导航即可进入地图,可导航,规划路线… 效果图 代码: wxml js wxss

    2024年02月11日
    浏览(39)
  • Unity 实现简单画板画画功能(笔记)

    创建一个plan 摄像机调成正交摄像机 创建三个cube,附上材质 再创建一个cube,找个色板, 创建一个脚本,挂在非失活物体上 创建一个slider,放在旁边 Unity 画板

    2024年02月15日
    浏览(30)
  • 微信小程序抽奖 简单功能实现

    抽奖是一种常见的互动活动,在微信小程序中也有很多不同的实现方式。以下是一份简单的微信小程序抽奖源码,供参考:在 wxml 文件中添加抽奖的页面布局: 在js 文件中添加抽奖逻辑: 实现了一个简单的地奖功能,用户点击“开始抽奖“按知后,抽奖结里会从奖品列表中贿机

    2024年02月16日
    浏览(35)
  • PageHelper分页功能的简单实现

          PageHelper是一个开源的Java分页插件,可以帮助开发者在MyBatis、Hibernate等持久层框架中实现分页功能。它提供了一系列的静态方法,可以简化分页查询的操作。 使用PageHelper进行分页,首先需要在项目中引入PageHelper的依赖,然后在代码中配置分页参数,并调用分页查询的

    2024年01月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包