go的HTTP网络编程

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

go的HTTP网络编程

1、http编程--server示例

Go 复制代码
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示例

Go 复制代码
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 请求:

Go 复制代码
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))
}
相关推荐
慕城南风2 小时前
Go语言中的defer,panic,recover 与错误处理
golang·go
刘大辉在路上3 小时前
突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除
git·后端·gitlab·版本管理·源代码管理
追逐时光者5 小时前
免费、简单、直观的数据库设计工具和 SQL 生成器
后端·mysql
初晴~5 小时前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱581366 小时前
InnoDB 的页分裂和页合并
数据库·后端
小_太_阳6 小时前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾6 小时前
scala借阅图书保存记录(三)
开发语言·后端·scala
星就前端叭7 小时前
【开源】一款基于Vue3 + WebRTC + Node + SRS + FFmpeg搭建的直播间项目
前端·后端·开源·webrtc
小林coding8 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云