提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、(每日治愈栏目)🚀🚀🚀
二、http请求协议☀️☀️☀️
http请求报文格式
一个http请求可以分为4部分:
1.请求行:包含三部分
1.格式 : 方法 + URL + 协议版本
2.实例 : POST + chapter17/user.html HTTP/1.1
3.请求方法:
(1) GET: 获取数据
(2) POST: 上传数据(表单格式,json格式)
(3) PUT: 修改数据
(4) DELETE: 用于删除数据
2.请求头
1.格式: key : value
2.可以有很多个键值对
3.常见重要头:
(1)Accept:接收数据的格式
(2)User-Agent:描述用户浏览器的信息
(3)Connection: Keep-Alive(长链接)Close(短链接)
(4)Accept_Encoding : 描述可以接受的编码
(5)Cookie: 由服务器设置的key=value数据,客户端下次请求的时候可以携带过来
(6)Content–Type:appliction/-form(表示上传的数据是表单格式)
4.空行
5.请求包体
(1)一般在POST方法时,会提供BODY
(2)在GET的时候也可以提供BODY,但是容易混淆,建议不要这样用
三、http响应协议☀️☀️☀️
1.http响应详解
http响应格式分为四部分:
1.第一部分 : 状态行
1.协议格式: 协议版本号 + 状态码 + 状态描述
2.实例: HTTP/1.1 + 200 +OK
3.常用的状态码:
1xx —》 客户端可以继续发送请求
2xx —> 正常访问
3xx —> 重定向
4xx
401 —> 未授权 not authorized
404 —> Not found
5xx
501 —> internal Error(服务器内部错误)
2.第二部分 : 响应头
1.Connect-Type : application/json
2.server: Apache
3.Data :…
3.第三部分 : 空行
==4.第四部分:==通常返回json数据
2.http响应代码演示
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
client := http.Client{}
resp, err := client.Get("https://www.baidu.com")
if err != nil {
fmt.Println("client.Get err:", err)
return
}
body := resp.Body
fmt.Println("body :", body)
readBodyStr, err := ioutil.ReadAll(body)
if err != nil {
fmt.Println("read body err:", err)
return
}
fmt.Println("body string:", string(readBodyStr))
ct := resp.Header.Get("Content-Type")
date := resp.Header.Get("Date")
server := resp.Header.Get("Server")
fmt.Println("Content-Type", ct)
fmt.Println("data:", date)
fmt.Println("server", server)
url := resp.Request.URL
code := resp.StatusCode
status := resp.Status
fmt.Println("url:", url)
fmt.Println("code:", code)
fmt.Println("status", status)
}
四、json编解码☀️☀️☀️
1.json编码
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
Id int
Name string
Age int
gender string //小写开头 在json编码时会忽略掉
}
func main() {
//在网络中传输的时候,把student结构体,编码成json字符串,传输 ===> 结构体 ====》 字符串 ===》编码
//接收字符串,需要将字符串转换成结构体 然后操作 ===》字符串 ===》 结构体 ===》 解密
lily := Student{
Id: 1,
Name: "Lily",
Age: 20,
gender: "女生",
}
encodeInfo, err := json.Marshal(&lily)
if err != nil {
fmt.Println("json.Marshal err:", err)
return
}
fmt.Println("encodeInfo", string(encodeInfo))
//反序列化
var lily2 Student
if err := json.Unmarshal([]byte(encodeInfo), &lily2); err != nil {
fmt.Println("json.Unmarshal err:", err)
return
}
fmt.Println("name:", lily2.Name)
fmt.Println("age:", lily2.Age)
fmt.Println("id:", lily2.Id)
}
2.结构体标签
package main
import (
"encoding/json"
"fmt"
)
type Teacher struct {
Name string `json:"-"` //在使用json编码时,这个编码不参与
Subject string `json:"Subject_name"` //在json编码时,这个字段会编码成Subject_name
Age int `json:""age,string` //age转换成string类型 一定要两个字段 名字+类型 中间不能有空格
gender string
Address string `json:"address,omitepty"` //不存在时会忽略
}
func main() {
t1 := Teacher{
Name: "AA",
Subject: "Golang",
Age: 18,
gender: "Man",
}
fmt.Println("t1:", t1)
encodeInfo, _ := json.Marshal(&t1)
fmt.Println("encodeInfo:", string(encodeInfo))
}
五、总结🍓🍓🍓
`