http编程
[toc]
postman
我们使用 postman
工具继续向服务端发送数据,只不过这个发送的是 Http
的 Get
请求:
客户端接收数据:
web工作流程
Web服务器的工作原理可以简单地归纳为
- 客户机通过
TCP/IP
协议建立到服务器的TCP连接 - 客户端向服务器发送
HTTP
协议请求包,请求服务器里的资源文档 - 服务器向客户机发送
HTTP
协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理 动态内容,并将处理得到的数据返回给客户端 - 客户机与服务器断开。由客户端解释
HTML
文档,在客户端屏幕上渲染图形结果
HTTP 协议
- 超文本传输协议(
HTTP
,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,它详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议 HTTP
协议通常承载于TCP协议之上
HTTP相应代码
package main
import (
"fmt"
"net/http"
)
func main() {
//http
client := http.Client{} //client{}是一个结构体,用于发送http请求
// 发送get请求
resp, err := client.Get("http://www.baidu.com")
if err != nil {
defer func() {
if err := recover(); err != nil {
println(err)
}
}()
panic(err) //panic()函数用于抛出异常
}
defer resp.Body.Close() // 关闭请求体
// 请求头
fmt.Println("请求头", resp.Header)
ct := resp.Header.Get("Content-Type")
data := resp.Header.Get("Date")
server := resp.Header.Get("Server")
fmt.Printf("Content-Type: %s\n Date: %s\n Server: %s\n", ct, data, server)
// 获取状态码
status := resp.StatusCode
fmt.Println("状态码", status)
// 获取响应体
body := resp.Body
fmt.Println("响应体", body)
// 获取Url
url := resp.Request.URL
fmt.Println("url", url)
// 拿到请求体
buf := make([]byte, 1024*4)
n, err := resp.Body.Read(buf)
if err != nil {
panic(err)
}
println(string(buf[:n]))
}
🚀 编译结果如下:
HTTP 服务端测试
提示
前面我们写的都是请求,接下来我们可以实现一个 server
,别人来请求,我们来响应~
/*
An elaborate, high quality docstring for the above function:
Args:
param1: the first parameter.
param2: the second parameter.
Returns:
the return value.
Raises:
KeyError: raises an exception.
*/
// http-server
package main
import (
"fmt"
"net/http"
)
func main() {
//注册路由
//xxxx/user ===> func1
//xxxx/name ===> func2
//xxxx/id ===> func3
http.HandleFunc("/user", func(writer http.ResponseWriter, request *http.Request) {
/*
+ writer: 用于写入响应数据,通过writer.Write()方法写入响应数据返回给客户端
+ request: 用于获取请求数据,通过request.Method获取请求方式,通过request.URL获取请求路径
*/
fmt.Fprintln(writer, "user") //表示向客户端返回数据user
})
http.HandleFunc("/name", func(writer http.ResponseWriter, request *http.Request) {
fmt.Fprintln(writer, "name")
})
http.HandleFunc("/id", func(writer http.ResponseWriter, request *http.Request) {
fmt.Fprintln(writer, "id")
})
//启动服务
fmt.Println("服务启动成功...")
if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil {
defer func() {
fmt.Println("http server start failed, err:", err)
}()
panic(err)
}
}
🚀 编译结果如下:
HTTP 服务端
package main
import (
"fmt"
"net/http"
)
func main() {
//http://127.0.0.1:8000/go
// 单独写回调函数
http.HandleFunc("/go", myHandler)
//http.HandleFunc("/ungo",myHandler2 )
// addr:监听的地址
// handler:回调函数
http.ListenAndServe("127.0.0.1:8000", nil)
}
// handler函数
func myHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println(r.RemoteAddr, "连接成功")
// 请求方式:GET POST DELETE PUT UPDATE
fmt.Println("method:", r.Method)
// /go
fmt.Println("url:", r.URL.Path)
fmt.Println("header:", r.Header)
fmt.Println("body:", r.Body)
// 回复
w.Write([]byte("www.5lmh.com"))
}
HTTP 服务端
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
//resp, _ := http.Get("http://www.baidu.com")
//fmt.Println(resp)
resp, _ := http.Get("http://127.0.0.1:8000/go")
defer resp.Body.Close()
// 200 OK
fmt.Println(resp.Status)
fmt.Println(resp.Header)
buf := make([]byte, 1024)
for {
// 接收服务端信息
n, err := resp.Body.Read(buf)
if err != nil && err != io.EOF {
fmt.Println(err)
return
} else {
fmt.Println("读取完毕")
res := string(buf[:n])
fmt.Println(res)
break
}
}
}
END 链接
✴️版权声明 © :本书所有内容遵循CC-BY-SA 3.0协议(署名-相同方式共享)©