跟着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学习(三)的更多相关文章

  1. java web 学习三(Tomcat 服务器学习和使用2)

    一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:

  2. Java Web 学习路线

    实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...

  3. web—第三章XHTML

     web—第三章XHTML 又是一周 我们学的了做表单:一开始我以为表单是表格.但结果:表单是以采集和提交用户输入数据的,这样讲很迷,说简单点就是登陆端.比如:Facebook.twitter.Ins ...

  4. Java Web学习系列——Maven Web项目中集成使用Spring

    参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...

  5. WEB学习路线2019完整版(附视频教程+网盘下载地址)

    WEB学习路线2019完整版(附视频教程+网盘下载地址).适合初学者的最新WEB前端学习路线汇总! 在当下来说web前端开发工程师可谓是高福利.高薪水的职业了.所以现在学习web前端开发的技术人员也是 ...

  6. Java反射:Web学习的灵魂

    反射:Web学习的灵魂 我们从最初的 javac -HelloWorld.java,到面向对象部分,我们可以将Java代码在计算机中经历的阶段分为三部分:Scource源代码阶段 -- Class类对 ...

  7. JAVA Web学习笔记

    JAVA Web学习笔记 1.JSP (java服务器页面) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . JSP全名为Java Server Pages,中文名叫java服务器 ...

  8. day 82 Vue学习三之vue组件

      Vue学习三之vue组件   本节目录 一 什么是组件 二 v-model双向数据绑定 三 组件基础 四 父子组件传值 五 平行组件传值 六 xxx 七 xxx 八 xxx 一 什么是组件 首先给 ...

  9. Salesforce LWC学习(三十九) lwc下quick action的recordId的问题和解决方案

    本篇参考: https://developer.salesforce.com/docs/component-library/bundle/force:hasRecordId/documentation ...

  10. HTTP学习三:HTTPS

    HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...

随机推荐

  1. systemctl 命令设置开机自启动失败

    哈喽大家好,我是咸鱼.今天跟大家分享一个关于 Linux 服务(service)相关的案例   案例现象 我在 3 月 31日的时候发表了一篇<shell 脚本之一键部署安装 Nginx> ...

  2. LeeCode 二叉树问题(二)

    二叉树的构建 LeeCode 106: 从中序遍历与后续遍历序列构造二叉树 题目描述 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, posto ...

  3. CentOS7---部署Tomcat和安装Jpress

    总览需求 1. 简述静态网页和动态网页的区别. 2. 简述 Webl.0 和 Web2.0 的区别. 3. 安装tomcat8,配置服务启动脚本,部署jpress应用. 1.简述静态网页和动态网页的区 ...

  4. javasec(六)RMI

    这篇文章介绍java-RMI远程方法调用机制. RMI全称是Remote Method Invocation,远程⽅法调⽤.是让某个Java虚拟机上的对象调⽤另⼀个Java虚拟机中对象上的⽅法,只不过 ...

  5. 如何将 Spire.Doc for C++ 集成到 C++ 程序中

    Spire.Doc for C++是一个专业的 Word 库,供开发人员在任何类型的 C++ 应用程序中阅读.创建.编辑.比较和转换 Word 文档. 本文演示了如何以两种不同的方式将 Spire.D ...

  6. Ansible 常用基础模块

    Ansible 常用基础模块 目录 Ansible 常用基础模块 Ansible的执行 Ansible ad-hoc ad-hoc模式的使用场景 ad-hoc模式的命令使用 ad-hoc结果返回颜色 ...

  7. jenkins的安装和配置(flask结合jenkins半自动化部署流程)

    jenkins在虚拟机中安装 1.1 背景介绍 Jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建.测试和部署等功能. Je ...

  8. 2022-06-06:大妈一开始手上有x个鸡蛋,她想让手上的鸡蛋数量变成y, 操作1 : 从仓库里拿出1个鸡蛋到手上,x变成x+1个, 操作2 : 如果手上的鸡蛋数量是3的整数倍,大妈可以直接把三分之

    2022-06-06:大妈一开始手上有x个鸡蛋,她想让手上的鸡蛋数量变成y, 操作1 : 从仓库里拿出1个鸡蛋到手上,x变成x+1个, 操作2 : 如果手上的鸡蛋数量是3的整数倍,大妈可以直接把三分之 ...

  9. 2021-09-10:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案

    2021-09-10:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标.你可以假设每种输入只会对应一个答案, ...

  10. vue全家桶进阶之路46:Vue3 Axios拦截器

    在Vue.js 3中,使用Axios与Vue.js 2.x中类似,但是需要进行一些修改和更新,下面是Vue.js 3中Axios的定义和使用方式: 首先,你需要安装Axios和Vue.js 3.x,可 ...