当前位置: 首页 > news >正文

大浪做网站公司网页制作是建网站的第几步

大浪做网站公司,网页制作是建网站的第几步,海南广播电视总台,平面设计服务方案Go 语言标准库中的net/http包十分的优秀,提供了非常完善的 HTTP 客户端与服务端的实现,仅通过几行代码就可以搭建一个非常简单的 HTTP 服务器。几乎所有的 go 语言中的 web 框架,都是对已有的 http 包做的封装与修改,因此&#xf…

Go 语言标准库中的net/http包十分的优秀,提供了非常完善的 HTTP 客户端与服务端的实现,仅通过几行代码就可以搭建一个非常简单的 HTTP 服务器。几乎所有的 go 语言中的 web 框架,都是对已有的 http 包做的封装与修改,因此,十分建议学习其他框架前最好先行掌握 http 包。

HTTP服务器

我们先初步介绍以下net/http包的使用,通过http.HandleFunc()http.ListenAndServe()两个函数就可以轻松创建一个简单的Go web服务器,示例代码如下:

package mainimport ("fmt""net/http"
)func helloHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, World!")
}func main() {http.HandleFunc("/hello", helloHandler)fmt.Println("Server starting on port 8080...")http.ListenAndServe(":8080", nil)
}

路由处理

http包提供了两种路由注册方式:

处理器函数(HandlerFunc)http.HandleFunc(pattern string, handler func(ResponseWriter, *Request))

func helloHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, World!")
}http.HandleFunc("/hello", helloHandler)

这种形式最为简单直接,适合处理简单的路由逻辑。http.HandleFunc内部会将函数转换为HandlerFunc类型,它实现了Handler接口。


处理器对象(Handler)http.Handle(pattern string, handler Handler)

type CounterHandler struct {count int
}func (h *CounterHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {h.count++fmt.Fprintf(w, "Visitor count: %d", h.count)
}handler := &CounterHandler{}
http.Handle("/counter", handler)

ServeMux路由

http.ServeMux是Go默认提供的多路复用器(路由器),它实现了Handler接口,可以看作是一个高级的路由管理器。它的工作原理是:

  1. 注册路由时,将路径模式(pattern)和处理器(handler)存储在内部映射中
  2. 收到请求时,按照最长匹配原则查找对应的处理器
  3. 如果找不到精确匹配,会尝试查找带斜杠的路径
  4. 最终都找不到则返回404错误
mux := http.NewServeMux()
mux.HandleFunc("/products/", productsHandler)
mux.HandleFunc("/articles/", articlesHandler)
mux.HandleFunc("/", indexHandler)

这种路由设计虽然简单,但对于RESTful API和传统Web应用已经足够。对于更复杂的需求,可以考虑第三方路由库如gorilla/mux。

HTTP客户端

GET请求

resp, err := http.Get("https://example.com")
if err != nil {// 处理错误
}
defer resp.Body.Close()body, err := io.ReadAll(resp.Body)
if err != nil {// 处理错误
}
fmt.Println(string(body))

POST请求

data := url.Values{}
data.Set("key", "value")resp, err := http.PostForm("https://example.com/form", data)
if err != nil {// 处理错误
}
defer resp.Body.Close()// 处理响应...

自定义请求

req, err := http.NewRequest("GET", "https://example.com", nil)
if err != nil {// 处理错误
}req.Header.Add("Authorization", "Bearer token123")
req.Header.Add("Content-Type", "application/json")client := &http.Client{Timeout: time.Second * 10,
}resp, err := client.Do(req)
if err != nil {// 处理错误
}
defer resp.Body.Close()// 处理响应...

中间件模式

中间件是构建模块化HTTP服务的关键模式。Go的中间件本质上是处理器的包装函数,可以在不修改核心业务逻辑的情况下,添加横切关注点功能。

基本中间件结构

func loggingMiddleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {start := time.Now()// 调用下一个处理器next.ServeHTTP(w, r)// 记录请求日志log.Printf("%s %s %s %v",r.Method,r.URL.Path,r.RemoteAddr,time.Since(start),)})
}

这种模式的工作流程是:

  1. 中间件接收一个处理器作为参数
  2. 返回一个新的处理器
  3. 新处理器在执行原有逻辑前后添加额外功能

中间件链

多个中间件可以串联形成处理链:

func authMiddleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {if !isAuthenticated(r) {http.Error(w, "Unauthorized", http.StatusUnauthorized)return}next.ServeHTTP(w, r)})
}func main() {mux := http.NewServeMux()mux.HandleFunc("/secure", secureHandler)// 构建中间件链handler := loggingMiddleware(authMiddleware(mux))http.ListenAndServe(":8080", handler)
}

中间件的执行顺序是从外到内,即先注册的中间件后执行。上面的例子中,请求会先经过日志记录,再进行认证检查。

上下文传递

中间件常用于在请求间传递值,这时应该使用context.Context

func requestIDMiddleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {// 生成唯一请求IDrequestID := uuid.New().String()// 创建新上下文并存储请求IDctx := context.WithValue(r.Context(), "requestID", requestID)// 设置响应头w.Header().Set("X-Request-ID", requestID)// 使用新上下文继续处理next.ServeHTTP(w, r.WithContext(ctx))})
}// 在处理器中获取请求ID
func handler(w http.ResponseWriter, r *http.Request) {requestID := r.Context().Value("requestID").(string)fmt.Fprintf(w, "Request ID: %s", requestID)
}

这种方式是线程安全的,避免了全局变量的问题,是Go中处理请求间数据传递的推荐方式。

参考资料:

Golang 中文学习文档 标准库 http包

http://www.dtcms.com/a/527760.html

相关文章:

  • 个人网站域名所有权网站开发期末作品代码和数据库运行好大全
  • 网站备案 湖北网页翻译器
  • wordpress怎么发长文章常德网站优化推广
  • 中国建设银行大学助学贷款网站莱芜金点子保安最新招聘信息
  • 那个网站可教做课件好百度销售岗位怎么样
  • 受欢迎的昆明网站建设抖音代运营合同模板免费
  • 鼓楼机关建设网站个人网站的制作步骤
  • 公司 网站源码网站备案账号是什么样的
  • 2013电子商务网站建设网站内做链接
  • 不建网站可不可以做cpa广西建设网个人登录
  • 佛山网站排名网络游戏定义
  • 做商城网站那个好大良制作网站
  • 昌邑微信网站建设公司梧州论坛一红豆社区
  • 如何做网站二级域名重庆大坪网站建设
  • 淄博网站制作公司推广wordpress添加注册页面
  • 帮人做网站收费合法吗建立客户档案表格模板
  • 郑州做手机网站建设宁波seo站外优化推广
  • 网站建设dyfwzx长春做网站网站
  • 教育平台网站建设调用wordpress编辑器
  • 国外域名抢注网站免费空间最大的网盘
  • 在哪里做网站比较好网站建设步和客户沟通
  • 烟台网站建设工作免费申请淘宝账号注册
  • 厦门高端网站案例深圳信息网
  • 动漫网站开发毕业设计北京市朝阳区
  • 免费域名申请网站大全东莞市有几个区
  • 百度网站推广价格wordpress有声电台
  • 做花馍网站网上注册商标如何注册
  • 当今做啥网站致富传奇类的网页游戏哪个好玩
  • 做wish如何利用数据网站买空间送网站模板
  • 社区网站设计网站建设维护人员岗位