学习Go语言Web框架Gee总结--上下文Context(二)

学习Go语言Web框架Gee总结--上下文Context

  • context/go.mod
  • context/main.go
  • context/gee/context.go
  • context/gee/router.go
  • context/gee/gee.go

学习网站来源:Gee

项目目录结构:
在这里插入图片描述

context/go.mod

module examplego 1.21.5require gee v0.0.0
replace gee => ./gee

context/main.go

package mainimport ("gee""net/http"
)func main() {r := gee.New()//http.StatusOK为常量200c.HTML(http.StatusOK, "<h1>Hello Gee</h1>")})r.GET("/hello", func(c *gee.Context) {c.String(http.StatusOK, "hello %s, you're at %s\n", c.Query("name"), c.Path)})r.POST("/login", func(c *gee.Context) {c.JSON(http.StatusOK, gee.H{"username": c.PostForm("username"),"password": c.PostForm("password"),})})r.Run(":9999")
}

Handler的参数变成成了gee.Context,提供了查询Query/PostForm参数的功能

/hello?firstname=Jane&lastname=Doe这样一个路由, firstname, lastname即是Querystring parameters, 要获取他们就需要使用Query相关函数.

c.Query("firstname") // Jane
c.Query("lastname") // Doe

对于POST, PUT等这些能够传递参数Body的请求, 要获取其参数, 需要使用PostForm

{"username":wang,"password":123
}
username:= c.PostForm("username")
password:= c.PostForm("password")

效果如下:
在这里插入图片描述

在这里插入图片描述

对于post请求
在这里插入图片描述

context/gee/context.go

package geeimport ("encoding/json""fmt""net/http"
)type H map[string]interface{}//自定义的Context结构体是一个用于在处理 HTTP 请求时封装请求上下文信息的工具,它简化了处理请求和返回响应的过程,提供了更加友好和便利的接口
type Context struct {Writer     http.ResponseWriterReq        *http.RequestPath       stringMethod     stringStatusCode int
}func newContext(w http.ResponseWriter, req *http.Request) *Context {return &Context{Writer: w,Req:    req,Path:   req.URL.Path,Method: req.Method,}
}func (c *Context) PostForm(key string) string {return c.Req.FormValue(key)
}func (c *Context) Query(key string) string {return c.Req.URL.Query().Get(key)
}
//用于设置响应的状态码
func (c *Context) Status(code int) {c.StatusCode = codec.Writer.WriteHeader(code)
}
//用于设置响应头中指定键的值
func (c *Context) SetHeader(key string, value string) {c.Writer.Header().Set(key, value)
}
//用于返回一个字符串格式的响应,设置响应头的 Content-Type 为 text/plain,并将格式化后的字符串写入到响应体中
func (c *Context) String(code int, format string, values ...interface{}) {c.SetHeader("Context-Type", "text/plain")c.Status(code)c.Writer.Write([]byte(fmt.Sprintf(format, values...)))
}
//使用json.NewEncoder将对象编码为JSON格式并写入到响应体中,如果在编码过程中出现错误,会返回 500 状态码
func (c *Context) JSON(code int, obj interface{}) {c.SetHeader("Context-Type", "application/json")c.Status(code)encoder := json.NewEncoder(c.Writer)if err := encoder.Encode(obj); err != nil {http.Error(c.Writer, err.Error(), 500)}
}
//用于返回原始的数据
func (c *Context) Data(code int, data []byte) {c.Status(code)c.Writer.Write(data)
}
//用于返回 HTML 内容,它接受一个状态码和一个 HTML 字符串作为参数
func (c *Context) HTML(code int, html string) {c.SetHeader("Content-Type", "text/html")c.Status(code)c.Writer.Write([]byte(html))
}

关于HTTP中的Context-Type

常见的媒体格式类型如下:

  • text/html : HTML格式
  • text/plain :纯文本格式
  • text/xml : XML格式
  • image/gif :gif图片格式
  • image/jpeg :jpg图片格式
  • image/png:png图片格式

以application开头的媒体格式类型:

  • application/xhtml+xml :XHTML格式
  • application/xml: XML数据格式
  • application/atom+xml :Atom XML聚合格式
  • application/json: JSON数据格式
  • application/pdf:pdf格式
  • application/msword : Word文档格式
  • application/octet-stream : 二进制流数据(如常见的文件下载)
  • application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

context/gee/router.go

将和路由相关的方法和结构单独提取了出来,放到了一个新的文件中router.go,方便我们下一次对 router 的功能进行增强,例如提供动态路由的支持

package geeimport ("log""net/http"
)type router struct {handlers map[string]HandlerFunc
}func newRouter() *router {return &router{handlers: make(map[string]HandlerFunc),}
}func (r *router) addRoute(method string, pattern string, handler HandlerFunc) {log.Printf("Route %4s - %s", method, pattern)key := method + "-" + patternr.handlers[key] = handler
}func (r *router) handle(c *Context) {key := c.Method + "-" + c.Pathif handler, ok := r.handlers[key]; ok {handler(c)} else {c.String(http.StatusNotFound, "404 NOT FOUND: %s\n", c.Path)}
}

context/gee/gee.go

框架入口

package geeimport "net/http"type HandlerFunc func(*Context)type Engine struct {router *router
}func New() *Engine {return &Engine{router: newRouter()}
}func (engine *Engine) addRoute(method string, pattern string, handler HandlerFunc) {engine.router.addRoute(method, pattern, handler)
}func (engine *Engine) GET(pattern string, handler HandlerFunc) {engine.addRoute("GET", pattern, handler)
}func (engine *Engine) POST(pattern string, handler HandlerFunc) {engine.addRoute("POST", pattern, handler)
}func (engine *Engine) Run(addr string) (err error) {return http.ListenAndServe(":9999", engine)
}func (engine *Engine) ServeHTTP(w http.ResponseWriter, r *http.Request) {c := newContext(w, r)engine.router.handle(c)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/591373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【23-24 秋学期】NNDL 作业13 优化算法3D可视化

编程实现优化算法&#xff0c;并3D可视化 1. 函数3D可视化 分别画出 和 的3D图 代码如下&#xff1a; from mpl_toolkits.mplot3d import Axes3D import numpy as np from matplotlib import pyplot as plt import torch from nndl.op import Op# 画出x**2 class Optimized…

查看ios 应用程序性能

目录 摘要 前言 性能概括 CPU内存监控 内存监控 磁盘监控 网络监控 GPU fps 摘要 本篇博文将介绍一款重量级性能测试工具——克魔助手&#xff0c;针对iOS应用程序的性能监控进行详细介绍。通过克魔助手&#xff0c;开发者可以方便地查看应用程序的CPU、内存、GPU性能…

【Python】配置环境变量

Python配置Windows系统环境变量 打开电脑属性 ——> 高级系统设置 ——> 高级 ——> 环境变量 Python安装目录 D:\Program Files\Python39 winR打开运行&#xff0c;输入cmd打开命令窗口 python -V

基于Java SSM框架实现停车场管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现停车场管理系统演示 摘要 以往的停车场管理事务处理主要使用的是传统的人工管理方式&#xff0c;这种管理方式存在着管理效率低、操作流程繁琐、保密性差等缺点&#xff0c;长期的人工管理模式会产生大量的文本车辆上报与文本数据&#xff0c;这对事务的…

Latex使用BibTeX添加参考文献,保持专有名词原格式,如全部大写方法

一、背景 当我们使用Latex写文章时&#xff0c;通常使用BibTeX的方式添加参考文献&#xff0c;这种方式非常方便&#xff0c;可以使用期刊定义好的参考文献格式。但有时&#xff0c;某篇参考文献题目中含有专有名词时&#xff0c;如DMPs&#xff0c;参考文献会自动将其转为小写…

Android ImageView的Bitmap在scaleType情况下Bitmap顶部与底部RectF坐标,Kotlin

Android ImageView的Bitmap在scaleType情况下&#xff0c;Bitmap顶部与底部RectF坐标&#xff0c;Kotlin 通常&#xff0c;在ImageView设置scaleType后&#xff0c;Android会把原始图片通过缩放放在ImageView里面&#xff0c;例如&#xff1a; <ImageViewandroid:id"id…

【心得】PHP反序列化高级利用(phar|session)个人笔记

目录 ①phar反序列化 ②session反序列化 ①phar反序列化 phar 认为是java的jar包 calc.exe phar能干什么 多个php合并为独立压缩包&#xff0c;不解压就能执行里面的php文件&#xff0c;支持web服务器和命令行 phar协议 phar://xxx.phar $phar->setmetadata($h); m…

Redis:原理+项目实战——Redis实战2(Redis实现短信登录(原理剖析+代码优化))

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理项目实战——Redis实战1&#xff08;session实现短信登录&#xff08;并剖析问题&#xff09;&#xff09…

实现CodeWave 低代码开发平台快速应用开发的完整指南

目录 前言1 CodeWave开发流程2 应用创建2.1 新建应用2.2 从应用模板创建应用 3 数据模型设计3.1 实体设计3.2 结构设计3.3 枚举设计 4 逻辑设计4.1 查询数据源设置4.2 组件和属性配置4.3 属性设置与服务端全局变量 5 页面设计5.1 选择页面模板5.2 前端全局变量设计5.3 事件逻辑…

cocos creator + vscode debug

安装插件 安装插件&#xff1a;JavaScript Debugger 配置 7456 为本地cocos creator的启动端口 启动debug调试 选择对应的启动方式

彻底理解前端安全面试题(2)—— CSRF 攻击,跨站请求伪造攻击详解,建议收藏(含源码)

前言 前端关于网络安全看似高深莫测&#xff0c;其实来来回回就那么点东西&#xff0c;我总结一下就是 3 1 4&#xff0c;3个用字母描述的【分别是 XSS、CSRF、CORS】 一个中间人攻击。当然 CORS 同源策略是为了防止攻击的安全策略&#xff0c;其他的都是网络攻击。除了这…

免费下载的高清影像如何使用?

由于该影像数据为DAT格式&#xff0c;因此这里以“北京”影像数据为例&#xff0c;为大家分享一下它的查看与导出等使用方法。 卫星影像数据示例 我们上传到百度网盘中的北京高清卫星影像数据有37.8GB&#xff0c;除了卫星影像数据和地名标签外&#xff0c;还包括接图表和常用…

SpringBoot灵活集成多数据源(定制版)

如来说世界&#xff0c;非世界&#xff0c;是名世界 如来说目录&#xff0c;非目录&#xff0c;是名目录 前言前期准备代码实现演示扩展 前言 本篇博客基于SpringBoot整合MyBatis-plus&#xff0c;如果有不懂这个的&#xff0c; 可以查看我的这篇博客&#xff1a;快速CRUD的秘诀…

信息化和数字化的本质区别是什么?

信息化和数字化是两个概念的区别 它们有什么区别和联系呢&#xff1f;信息化&#xff1a;“业务数据化”&#xff0c;先让业务流程能被数据记录下来。信息化“业务数据化”。数字化&#xff1a;“数据业务化”&#xff0c;用已累积的业务数据去反哺优化业务流程。数字化“数据…

C++:继承(这一篇就够了)

C&#xff1a;继承&#xff08;这一篇就够了&#xff09; 一、继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1定义格式1.2.2 继承关系和访问限定符1.2.3 继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与静态…

可穿戴智能设备应用领域以及使用意义分别有哪些?

可穿戴智能设备有哪些&#xff1f; 可穿戴智能设备是指可以佩戴在身上&#xff0c;具有智能功能和交互能力的电子设备。以下是一些常见的可穿戴智能设备&#xff1a; 智能手表&#xff1a;智能手表结合了传统手表的功能和智能设备的特性&#xff0c;可以显示时间、接收通知、监…

Linux下一切皆文件

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 你是否听过Linux下一切皆文件&#xff1f; 在哪里我们体悟到了Linux下一切皆文件&#xff1f; 文件是什么&#xff1f; 在哪里体悟到的&#xff1f; 常见疑惑 怎么办到的Linux下一切皆文件&#xff1f; 我们抛出…

LED显示屏常用驱动芯片一览表

LED显示屏驱动芯片是专门用于驱动LED显示屏的核心芯片&#xff0c;它能够将输入的电信号转化为驱动能力&#xff0c;以控制LED灯的亮度和颜色。LED显示屏驱动芯片具有高可靠性、低功耗、长寿命等优点&#xff0c;是LED显示屏产业的核心零部件之一。 SM16306SJ LED显示屏驱动芯…

《MySQL系列-InnoDB引擎02》InnoDB存储引擎介绍

文章目录 第二章 InnoDB存储引擎1 InnoDB存储引擎概述2 InnoDB存储引擎的版本3 InnoDB体系架构3.1 后台线程3.2 内存 4 Checkpoint技术5 Master Thread 工作方式5.1 InnoDB 1.0.x版本之前的Master Thread5.2 InnoDB 1.2.x版本之前的Master Thread5.3 InnoDB 1.2.x版本的Master …

python写入csv文件总是多出一行空行(windows)

问题代码 import csv from os import pathfull_path path.abspath(__file__) path_dir path.dirname(full_path)data [[Name, Age, City],[John, 25, New York],[Alice, 30, Los Angeles],[Bob, 35, Chicago] ] # 代码使用都是正常的&#xff0c;但是总是多出一行空格 with…