GO web学习(三)
跟着b站https://space.bilibili.com/361469957 杨旭老师学习做的笔记
路由
Controller / Router
角色
- main():设置类工作
- controller:
- 静态资源
- 把不同的请求送到不同的 controller 进行处理
它会根据请求,匹配最具体的 handler
路由参数
静态路由:一个路径对应一个页面
/home
/about
带参数的路由:根据路由参数,创建出一族不同的页面
/companies/123
/companies/Microsoft
-controller ----company.go
----content.go
----controller.go
----home.go
company.html
companies.html
content.html
home.html
layout.html
main.go
-wwwroot ----css -----style.css
----js -----script.js
----image -----img1.png
// controller.go
package controller
func RegisterRoutes(){
registerContentRouts()
registerHomeRouts()
registerCompanyRoutes()
registerStaticResource()
}
func registerStaticResource(){
http.Handle("/css/",http.FileServer(http.Dir("wwwroot")))
http.Handle("/img/",http.FileServer(http.Dir("wwwroot")))
http.Handle("/js/",http.FileServer(http.Dir("wwwroot")))
}
//company.go
package controller
import (
"net/http"
"text/template"
"strconv"
"regexp"
)
func registerCompanyRoutes(){
http.HandleFunc("/companies",handleCompanies)
http.HandleFunc("/companies/",handleCompany)
}
func handleCompanies(w http.ResponseWriter, r *http.Request){
t,_ := template.ParseFiles("companies.html")
t.ExecuteTemplate(w,"content",nil)
}
func handleCompany(w http.ResponseWriter, r *http.Request){
pattern ,_ := regexp.Compile(`/companies/(\d+)`)
matches := pattern.FindStringSubmatch(r.URL.Path)
t,_ := template.ParseFiles("company.html")
if len(matches) >0{
companyID ,_ := strconv.Atoi(matches[1])
t.ExecuteTemplate(w,"content",companyID)
}else{
w.WriteHeader(http.StatusNotFound)
}
}
//content.go
package controller
import (
"net/http"
"text/template"
)
func registerContentRouts(){
http.HandleFunc("/content", handleContent)
}
func handleContent(w http.ResponseWriter, r *http.Request) {
t,_ := template.ParseFiles("content.html","layout.html")
t.ExecuteTemplate(w,"layout","hello world")
}
//home.go
package controller
import (
"net/http"
"text/template"
)
func registerHomeRouts(){
http.HandleFunc("/home", handleHome)
}
func handleHome(w http.ResponseWriter, r *http.Request){
t,_ := template.ParseFiles("home.html")
t.ExecuteTemplate(w,"content","")
}
最小惊讶原则
绑定 handler
/hello ——》 hello
/index ——》 index
/wow/ ——》 wow
则实际操作时
/index ——》 index
/hello/two ——》 index
/wow/two ——》 wow
第三方路由器
gorilla/mux:灵活性高、功能强大、性能相对差一些
httprouter:注重性能、功能简单
web 服务
REST 速度块,构建简单 -》 服务外部和第三方开发者
SOAP 安全并健壮 -》 内部应用的企业集成
【API技术核心原理】REST | GraphQL | gRPC | tRPC
https://www.bilibili.com/video/BV1yL41167fD/?share_source=copy_web&vd_source=03c1dc52eeb3747825ecad0412c18ab1
JSON
JSON 与 Go 的 Struct
{
"id":123,
"name":"CNSA",
"country":"China"
}
type SpaceAdministration struct{
ID int
Name string
Country string
}
结构标签
对应映射
type SpaceAdministration struct{
ID int `json:"id"`
Name string `json:"name"`
Country string `json:"country"`
}
类型映射
Go bool:JSON boolean
Go float64:JSON 数值
Go string:JSON strings
Go nil:JSON null.
对于未知结构的 JSON
map[string]interface{} 可以存储任意 JSON 对象
[]interface{} 可以存储任意的 JSON 数组
读取 JSON
- 需要一个解码器:dec := json.NewDecoder(r.Body)
- 参数需实现 Reader 接口
- 在解码器上进行解码:dec.Decode(&query)
写入JSON
需要一个编码器:enc := json.NewEncoder(w)
参数需实现 Writer 接口
编码:enc.Encode(results)
Marshal 和 Unmarshal
Marshal(编码): 把 go struct 转化为 json 格式
MarshalIndent,带缩进
Unmarshal(解码): 把 json 转化为 go struct
两种方式区别
针对 string 或 bytes:
- Marshal => String
- Unmarshal <= String
针对 stream:
- Encode => Stream,把数据写入到 io.Writer
- Decode <= Stream,从 io.Reader 读取数据
type Company struct{
ID int `json:"id"`
Name string `json:name`
Country string `json:country`
}
jsonStr := `{
"id":1213,
"name": "红旗",
"country": "中国"
}`
c := Company{}
//返回一个error,这里没管这个error
// Unmarshal 把 json 转化为 go struct
_ = json.Unmarshal([]byte(jsonStr),&c)
fmt.Println(c)
// {1213 红旗 中国}
//Marshal 把 go struct 转化为 json 格式
bytes ,_ := json.Marshal(c)
fmt.Println(string(bytes))
// {"id":1213,"Name":"红旗","Country":"中国"}
//这个是用来调格式,让格式好看的
bytes1 ,_ := json.MarshalIndent(c,""," ")
fmt.Println(string(bytes1))
// {
// "id": 1213,
// "Name": "红旗",
// "Country": "中国"
// }
http.HandleFunc("/companies",func(w http.ResponseWriter, r *http.Request) {
switch r.Method{
case http.MethodPost:
//解码器
dec:= json.NewDecoder(r.Body)
company:= Company{}
// 解码
err:=dec.Decode(&company)
if err!=nil{
log.Println(err.Error())
w.WriteHeader(http.StatusInternalServerError)
return
}
// 编码器
enc := json.NewEncoder(w)
// 编码
err = enc.Encode(company)
if err!=nil{
log.Println(err.Error())
w.WriteHeader(http.StatusInternalServerError)
return
}
default:
w.WriteHeader(http.StatusMethodNotAllowed)
}
})
http.ListenAndServe(":8080",nil)
这个和上面相配合的test.http。注意content-type和json数据之间必须有空行
POST http://localhost:8080/companies HTTP/1.1
content-type: application/json
{
"id":1213,
"name": "红旗",
"country": "中国"
}
GO web学习(三)的更多相关文章
- java web 学习三(Tomcat 服务器学习和使用2)
一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:
- Java Web 学习路线
实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...
- web—第三章XHTML
web—第三章XHTML 又是一周 我们学的了做表单:一开始我以为表单是表格.但结果:表单是以采集和提交用户输入数据的,这样讲很迷,说简单点就是登陆端.比如:Facebook.twitter.Ins ...
- Java Web学习系列——Maven Web项目中集成使用Spring
参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...
- WEB学习路线2019完整版(附视频教程+网盘下载地址)
WEB学习路线2019完整版(附视频教程+网盘下载地址).适合初学者的最新WEB前端学习路线汇总! 在当下来说web前端开发工程师可谓是高福利.高薪水的职业了.所以现在学习web前端开发的技术人员也是 ...
- Java反射:Web学习的灵魂
反射:Web学习的灵魂 我们从最初的 javac -HelloWorld.java,到面向对象部分,我们可以将Java代码在计算机中经历的阶段分为三部分:Scource源代码阶段 -- Class类对 ...
- JAVA Web学习笔记
JAVA Web学习笔记 1.JSP (java服务器页面) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . JSP全名为Java Server Pages,中文名叫java服务器 ...
- day 82 Vue学习三之vue组件
Vue学习三之vue组件 本节目录 一 什么是组件 二 v-model双向数据绑定 三 组件基础 四 父子组件传值 五 平行组件传值 六 xxx 七 xxx 八 xxx 一 什么是组件 首先给 ...
- Salesforce LWC学习(三十九) lwc下quick action的recordId的问题和解决方案
本篇参考: https://developer.salesforce.com/docs/component-library/bundle/force:hasRecordId/documentation ...
- HTTP学习三:HTTPS
HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...
随机推荐
- Junit5 pom依赖
<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter- ...
- 最新升级优化 shopee|美客多 Mercadolibre|shopfiy|lazada|独立货代贴单系统 可规模化的贴单打单系统 源码下载独立部署
七想网络 跨境猴 最新优化改进版本的 虾皮代打包-虾皮代贴单 独立部署源码版本货代贴单系统 介绍: 台湾海外仓_shopee货代_虾皮物流–虾皮代贴单 虾皮代打包-虾皮代贴单-虾皮货代平台 shope ...
- [apue] 一图读懂 Unix 时间日期例程相互关系
概览 开门见山先上图 界定一些术语,方便后面说明: GMT:格林威治平均时,太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间为中午 12 点,1972 年之前使用的国际标准时间,因地球在它的椭圆 ...
- ROS机器人雷达跟随
ROS机器人雷达跟随 初始化 打开一个终端输入: ssh clbrobot@ip # 连接小车 roslaunch clbrobot bringup.launch # 激活主板 开启摄像头 开新终端输 ...
- devops|中小公司效率为王,没必要度量
之前写过一篇文章<devops|中小公司不要做研发效能度量>,主要是从基础设施方向考虑,因为很多条件都不具备,贸然高投入去做研发效能度量可能达不到我们的预期效果,给出的建议是先做好当下打好 ...
- Vue中使用Echarts 脱坑
1. 数据问题,不像官方实例所提供的数据直接写在options对应的数据源里,开发中应当是后端接口请求过来的数据,一般来说,会将echarts图标抽成组件的形式,需要的数据源通过父组件传给子组件,但是 ...
- 【已解决】使用代理后,登陆微软账号提示0x800190001
今天晚上想要登录Onedrive同步文件时,发现怎么都登陆不上去,报出的错误代码是0x80190001,在网上搜索了各种方法,重置网络,重置Onedrive都没什么用,甚至把Onedrive重装了一遍 ...
- SQLLabs靶场 less11-20
SQLLabs靶场 less11-20 Less-11-16 请求方式 注入类型 拼接方式 POST 联合.报错.布尔盲注.延时盲注 username='x'11 请求方式 注入类型 拼接方式 POS ...
- ACM中的java的使用;
java大法好,退C保平......开玩笑的: 1.头文件: import java.math.*; // 包含大数类的包 import java.util.*; // 包含输入头的包 2.程序主体, ...
- 2021-05-19:给定一个非负数组成的数组,长度一定大于1,想知道数组中哪两个数&的结果最大。返回这个最大结果。时间复杂度O(N),额外空间复杂度O(1)。
2021-05-19:给定一个非负数组成的数组,长度一定大于1,想知道数组中哪两个数&的结果最大.返回这个最大结果.时间复杂度O(N),额外空间复杂度O(1). 福大大 答案2021-05-1 ...