web开发基础知识
静态web与动态web
web:网页
静态web:
- html、css
- 提供给所有的人数据不会发生变化
动态web:
- 淘宝、京东几乎所有的网站
- 提供给所有人的数据始终会发生变化、每个人在不同的时间内、不同的地点看到的信息也不同
web应用程序
可以提供浏览器访问的程序
服务器---网络请求
url https://www.kuangstudy.com/ ---解析:ip地址 服务器
你们能访问到的任何一个页面和资源,都存在于这个世界的某一个角落的计算机上
什么是HTTP
HTTP(超文本传输协议)请求---响应
- 文本:html、字符串......
- 超文本:图片、视频、音乐、地图......
- 端口:80
https: s==ssl,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性
- 443
http请求响应
客户端 ---> 发送请求Request---> 服务端 https://www.baidu.com
- 请求方式:get
- 请求方式:Get,Post ,head、delete、put、tract
- get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
- post:请求能够携带的参数没有限制,大小没有限制,不会再浏览器的URL地址栏显示数据内容,安全,但不高效
响应:
-
服务器---> 响应Request---> 客户端
-
数据格式
- 网页
- json
- 文本
- 文件
- ......
-
状态码
-
200
-
http.StatusOK= 200成功连接访问。
http.StatusFound = 302页面跳转的状态码。
http.StatusBadRequest = 400非法请求,服务端无法解析。http.StatusUnauthorized = 401权限受限,未通过。
http.StatusForbidden = 403禁止访问。
http.StatusNotFound = 404请求页面不存在。
http.StatuslnternalServerError = 500服务器内部错误。|
-
web应用程序工作流程
Web服务器的工作原理可以简单地归纳为:
- 客户机通过TCP/IP协议建立到武器的TCP连接
- 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档
- 服务器向客户机发送HTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理"动态内容”,并将处理得到的数据返回给客户端
- 客户机与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果
HTTP编程
Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现
package main
import (
"fmt"
"net/http"
)
func main() {
//请求处理HandleFunc
http.HandleFunc("/hello", hello)
//端口ListenAndServe
http.ListenAndServe("localhost:8080", nil) //端口号为localhost:8080,服务器为nil表示默认,用handler服务器
}
func hello(writer http.ResponseWriter, request *http.Request) {
//可以打印输出请求的信息
fmt.Println(request.URL)
fmt.Println(request.Method) //请求的方法
fmt.Println(request.RemoteAddr) //请求的地址
fmt.Println("程序被访问到了....")
// 也可以写入信息
writer.Write([]byte("heelo,学相伴"))
}
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
//获取Get
response, _ := http.Get("http://localhost:8080/hello")
defer response.Body.Close()
// 请求和响应存储的数据Body,读取信息Read
buf := make([]byte, 1024) //创建一个切片用于读取信息
// for打印输出
for {
n, erro := response.Body.Read(buf)
if erro != nil && erro != io.EOF {
fmt.Println(erro)
return
} else {
fmt.Println("读取到的信息", string(buf[:n])) //将从0:n接受的数字信息转换为string字符
break
}
}
}
带参数的请求
关于GET的参数需要使用GO语言内置的net/url这个标准库来处理
http.HandleFunc("/login", login)
func login(writer http.ResponseWriter, request *http.Request) {
//获取用户传递过来的数据
data := request.URL.Query()
username := data.Get("username")
password := data.Get("password")
fmt.Println("username", "password", username, password)
//响应信息给客户端
writer.Write([]byte(`{"登录状态:ok"}`))
}
package main
import (
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
//定义请求的数据 urlstr
urlstr := "http://localhost:8080/login"
// 拼接参数valuses
data := url.Values{}
data.Set("username", "kuangshenshuo")
data.Set("password", "123456")
// 解析url:ParseRequestURI
rurl, _ := url.ParseRequestURI(urlstr)
//RawQuery数据绑定 ,Encode可以将编码转换为string
rurl.RawQuery = data.Encode()
// 发送请求
resp, _ := http.Get(rurl.String())
// 读取方式选择io下的ReadAll
b, _ := io.ReadAll(resp.Body)
fmt.Println(string(b))
}
处理前端表单数据
编写注册表单
package main
import (
"fmt"
"net/http"
)
func main() {
//请求处理HandleFunc
http.HandleFunc("/register", register)
//端口ListenAndServe
http.ListenAndServe("localhost:8080", nil) //端口号为localhost:8080,服务器为nil表示默认,用handler服务器
}
func register(writer http.ResponseWriter, request *http.Request) {
request.ParseForm()
fmt.Println(request.ParseForm())
username := request.PostForm.Get("username")
password := request.PostForm.Get("password")
fmt.Println("username:", username, "password:", password)
//响应信息给客户端
writer.Write([]byte(`{"登录状态:ok"}`))
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册表单</title>
</head>
<body>
<form action="http://localhost:8080/register" method="post">
<p>
用户名:<input type="text" name="username">
</p>
<p>
密码:<input type="password" name="password">
</p>
<input type="submit" value="提交">
</form>
</body>
</html>
响应页面
模板文件中使用{{和}}包裹和标识需要传入的数据。
传给模板这样的数据就可以通过点号(.)来访问,如果数据是复杂类型的数据,可以通过( (.FieldName })来访问它的字段。
除{{和}}包裹的内容外,其他内容均不做修改原样输出。
如果要传入多个参数,一般都使用map 或者struct类型。