go的HTTP网络编程

欢迎大家到我的博客浏览。go的HTTP网络编程 | YinKai's Blog

go的HTTP网络编程

1、http编程--server示例

package main
​
import (
    "fmt"
    "net/http"
)
​
func main() {
    // 注册处理函数,定义 URL 路由和对应的处理函数
    http.HandleFunc("/", Hello)         // 根路径 "/" 的请求交给 Hello 函数处理
    http.HandleFunc("/login", Login)   // "/login" 路径的请求交给 Login 函数处理
​
    // 启动 HTTP 服务器,监听指定的地址和端口
    err := http.ListenAndServe("0.0.0.0:8080", nil)   // 启动服务器,监听地址 "0.0.0.0:8080",使用默认的路由器和处理器
    if err != nil {
        fmt.Println("HTTP 服务器启动失败", err)
    }
}
​
func Hello(w http.ResponseWriter, r *http.Request) {
    // 处理根路径 "/" 的请求
    fmt.Fprintf(w, "Hello, World!")   // 将 "Hello, World!" 写入 http.ResponseWriter,作为 HTTP 响应的内容
}
​
func Login(w http.ResponseWriter, r *http.Request) {
    // 处理 "/login" 路径的请求
    fmt.Fprintf(w, "Login page")   // 将 "Login page" 写入 http.ResponseWriter,作为 HTTP 响应的内容
}
​

示例说明:

  • http.HandleFunc("/", Hello):注册处理函数 Hello,将根路径 "/" 的请求交给 Hello 函数处理。

  • http.HandleFunc("/login", Login):注册处理函数 Login,将 "/login" 路径的请求交给 Login 函数处理。

  • http.ListenAndServe("0.0.0.0:8080", nil):启动一个 HTTP 服务器,监听地址为 "0.0.0.0:8080",传入 nil 作为处理器,表示使用默认的路由器和处理器。

  • Hello 函数和 Login 函数分别是处理根路径和 "/login" 路径请求的处理函数,它们接收一个 http.ResponseWriter 和一个 http.Request 参数,分别用于写入响应和读取请求信息。

  • fmt.Fprintf(w, ...):使用 Fprintf 函数将字符串写入到 http.ResponseWriter 中,作为 HTTP 响应的内容。

2、http编程--Client示例

package main
​
import (
    "fmt"
    "io/ioutil"
    "net/http"
)
​
func main() {
    // 创建一个 HTTP 客户端
    client := http.Client{}
​
    // 构建 GET 请求
    req, err := http.NewRequest("GET", "https://www.example.com", nil)
    if err != nil {
        fmt.Println("创建请求失败", err)
        return
    }
​
    // 发送请求
    res, err := client.Do(req)
    if err != nil {
        fmt.Println("请求失败", err)
        return
    }
    defer res.Body.Close() // 在函数结束时关闭响应的 Body
​
    // 读取响应的内容
    data, err := ioutil.ReadAll(res.Body)
    if err != nil {
        fmt.Println("读取响应失败", err)
        return
    }
​
    // 输出响应的内容
    fmt.Println(string(data))
}

示例说明:

  • http.Client{}:创建一个 HTTP 客户端,用于发送 HTTP 请求。

  • http.NewRequest("GET", "https://www.example.com", nil):构建一个 GET 请求,并指定请求的 URL、请求方法和请求体。

  • client.Do(req):发送请求并获取响应,返回一个 http.Response 对象。

  • defer res.Body.Close():在函数结束时关闭响应的 Body,确保资源被正确释放。

  • ioutil.ReadAll(res.Body):从响应的 Body 中读取内容,返回一个字节数组。

  • fmt.Println(string(data)):将读取到的响应内容转换为字符串并输出。

3、常见HTTP请求方法

  1. GET:从服务器获取资源。客户端向服务器请求获取指定 URL 对应的资源,并从服务器返回该资源的内容。GET 请求通常用于获取数据,而不对服务器上的资源进行修改。

  2. POST:向服务器提交数据。客户端向服务器提交数据,请求服务器对该数据进行处理。POST 请求通常用于向服务器提交数据,如表单数据、上传文件等。

  3. PUT:更新服务器上的资源。客户端向服务器传送数据,请求服务器更新指定 URL 对应的资源。PUT 请求通常用于更新资源。

  4. DELETE:删除服务器上的资源。客户端向服务器请求删除指定 URL 对应的资源。DELETE 请求通常用于删除资源。

  5. HEAD:类似于 GET 请求,但只返回响应头部,不返回响应体。用于获取资源的元信息,如文件大小、文件类型等,而不获取实际的资源内容。

  6. OPTIONS:请求服务器返回对指定 URL 支持的通信选项。服务器将返回支持的 HTTP 请求方法、头部字段等信息,用于客户端了解服务器的功能和约束。

  7. PATCH:对服务器上的资源进行部分更新。客户端向服务器传送数据,请求服务器对指定 URL 对应的资源进行部分更新。

  8. CONNECT:建立网络隧道。通常用于代理服务器,用于在客户端和目标服务器之间建立隧道,用于安全的加密通信。

  9. TRACE:用于调试,请求服务器返回对请求和响应的诊断信息。不常用于实际生产环境。

4、下面是一个简单的 Go 语言程序,演示了如何使用 HTTP 请求方法进行基本的 HTTP 请求:

package main
​
import (
    "fmt"
    "net/http"
    "io/ioutil"
)
​
func main() {
    // GET 请求示例
    resp, err := http.Get("https://jsonplaceholder.typicode.com/posts/1") // 发起 GET 请求
    if err != nil {
        fmt.Println("GET 请求错误:", err)
        return
    }
    defer resp.Body.Close() // 确保在函数退出前关闭响应体
​
    data, err := ioutil.ReadAll(resp.Body) // 读取响应体数据
    if err != nil {
        fmt.Println("读取响应数据错误:", err)
        return
    }
​
    fmt.Println("GET 请求响应数据:", string(data)) // 打印响应数据
​
    // POST 请求示例
    resp, err = http.Post("https://jsonplaceholder.typicode.com/posts", "application/json", nil) // 发起 POST 请求
    if err != nil {
        fmt.Println("POST 请求错误:", err)
        return
    }
    defer resp.Body.Close()
​
    data, err = ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("读取响应数据错误:", err)
        return
    }
​
    fmt.Println("POST 请求响应数据:", string(data))
​
    // PUT 请求示例
    req, err := http.NewRequest("PUT", "https://jsonplaceholder.typicode.com/posts/1", nil) // 创建 PUT 请求
    if err != nil {
        fmt.Println("创建 PUT 请求错误:", err)
        return
    }
​
    client := &http.Client{}
    resp, err = client.Do(req) // 发起 PUT 请求
    if err != nil {
        fmt.Println("PUT 请求错误:", err)
        return
    }
    defer resp.Body.Close()
​
    data, err = ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("读取响应数据错误:", err)
        return
    }
​
    fmt.Println("PUT 请求响应数据:", string(data))
​
    // DELETE 请求示例
    req, err = http.NewRequest("DELETE", "https://jsonplaceholder.typicode.com/posts/1", nil) // 创建 DELETE 请求
    if err != nil {
        fmt.Println("创建 DELETE 请求错误:", err)
        return
    }
​
    resp, err = client.Do(req) // 发起 DELETE 请求
    if err != nil {
        fmt.Println("DELETE 请求错误:", err)
        return
    }
    defer resp.Body.Close()
​
    data, err = ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("读取响应数据错误:", err)
        return
    }
​
    fmt.Println("DELETE 请求响应数据:", string(data))
}

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Go语言(Golang)的网络编程是针对大规模后端服务程序设计的,网络通信在服务端程序中是不可或缺且至关重要的一部分。Go语言提供了两种主要的网络编程方式,即TCP socket编程和HTTP编程。 在TCP socket编程中,Go语言的net包提供了可移植的网络I/O接口,包括TCP/IP、UDP、域名解析和Unix域socket等。通过使用net包,可以方便地进行网络数据的传输和接收。在网络编程中,使用net.Listen函数可以返回一个在指定网络地址上监听的Listener,然后使用Accept函数等待客户端的连接请求,并创建一个新的goroutine来处理每个连接。同时,使用net.Conn接口可以进行数据的发送和接收。 下面是一个简单的示例代码,展示了如何使用Go语言进行TCP socket编程: ```go package main import ( "fmt" "net" ) func process(conn net.Conn) { defer conn.Close() for { buf := make([]byte,1024) n, err := conn.Read(buf) if err != nil { fmt.Println("读取数据错误:", err) return } fmt.Print(string(buf[:n])) } } func main() { fmt.Println("服务器开始监听...") listen, err := net.Listen("tcp", "0.0.0.0:8888") defer listen.Close() if err != nil { fmt.Println("监听错误:", err) return } for { fmt.Println("等待客户端连接...") conn, err := listen.Accept() if err != nil { fmt.Println("接受连接错误:", err) return } else { fmt.Printf("接受到客户端连接, 客户端地址:%v\n", conn.RemoteAddr()) go process(conn) } } } ``` 以上代码实现了一个简单的服务器程序,它监听本地地址的8888端口,并在接受到客户端连接后创建一个新的goroutine来处理连接。在处理连接的goroutine中,使用conn.Read函数从连接中读取数据,然后将读取到的数据打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胤凯o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值