Go中 net/http 使用

简介: Go中 net/http 使用

转载请注明出处:

  net/http是Go语言标准库中的一个包,提供了实现HTTP客户端和服务器的功能。它使得编写基于HTTP协议的Web应用程序变得简单和方便。

  net/http包的主要用途包括:

  1. 实现HTTP客户端:可以发送HTTP请求并接收服务器的响应。
  2. 实现HTTP服务器:可以创建一个HTTP服务器,接受客户端的请求并返回响应

1.实现HTTP客户端

1.1发送GET请求:

package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
)
func main() {
    // 发送GET请求
    resp, err := http.Get("https://www.baidu.com")
    if err != nil {
        fmt.Println("请求失败:", err)
        return
    }
    defer resp.Body.Close()
    // 读取响应内容
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("读取响应失败:", err)
        return
    }
    fmt.Println("响应内容:", string(body))
}

  上面使用http.Client创建了一个HTTP客户端对象,并通过其Get方法发送了一个GET请求。然后通过ioutil.ReadAll方法读取响应的内容,并打印出来。

  其运行之后结果如下:

           

1.2 发送POST请求

package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
    "strings"
)
func main() {
    // POST请求数据
    payload := strings.NewReader("name=John&age=30")
    // 发送POST请求
    resp, err := http.Post("https://api.example.com/submit", "application/x-www-form-urlencoded", payload)
    if err != nil {
        fmt.Println("请求失败:", err)
        return
    }
    defer resp.Body.Close()
    // 读取响应内容
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("读取响应失败:", err)
        return
    }
    fmt.Println("响应内容:", string(body))
}

  通过http.Post方法发送了一个POST请求,并从响应中读取了内容。需要注意的是,第二个参数指定了请求的Content-Type为application/x-www-form-urlencoded,并且通过strings.NewReader创建了请求体。

1.3自定义请求

package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
)
func main() {
    // 创建一个自定义请求
    req, err := http.NewRequest("GET", "https://api.example.com/data", nil)
    if err != nil {
        fmt.Println("创建请求失败:", err)
        return
    }
    // 可以设置请求头部信息
    req.Header.Add("Authorization", "Bearer token123")
    // 发送自定义请求
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("请求失败:", err)
        return
    }
    defer resp.Body.Close()
    // 读取响应内容
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("读取响应失败:", err)
        return
    }
    fmt.Println("响应内容:", string(body))
}

  上面首先使用http.NewRequest方法创建了一个自定义的GET请求,然后可以通过req.Header.Add方法设置请求头部信息。最后使用client.Do方法发送自定义请求,并从响应中读取内容。

2.HTTP服务器

2.1创建HTTP服务器:

// 定义处理器函数
func helloHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello, World!")
}
// 注册处理器函数
http.HandleFunc("/", helloHandler)
// 启动HTTP服务器
err := http.ListenAndServe(":8080", nil)
if err != nil {
    fmt.Println("Server error:", err)
}

  上面定义了一个处理器函数helloHandler,该函数对所有的HTTP请求都返回"Hello, World!"。使用http.HandleFunc方法将处理器函数注册到根路径"/"上。然后通过http.ListenAndServe方法启动了一个监听在端口8080的HTTP服务器。

  当有客户端请求到达时,服务器会调用相应的处理器函数来处理请求并返回响应。

2.2 实现路由

  在net/http中,路由是指根据不同的URL路径来匹配和执行相应的处理函数。通过路由,我们可以将不同的URL请求映射到不同的处理逻辑上。

  net/http包提供了http.HandleFunc和http.Handle两个方法用于注册路由处理函数。

  1. http.HandleFunc方法:
    http.HandleFunc方法允许我们直接指定一个处理函数来处理特定的URL路径。示例代码如下:
// 定义处理函数
func helloHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello, World!")
}
// 注册处理函数
http.HandleFunc("/hello", helloHandler)

  上面定义了一个处理函数helloHandler,当客户端请求路径为"/hello"时,服务器会调用该函数进行处理并返回"Hello, World!"。

  2. http.Handle方法:

  http.Handle方法允许我们使用自定义的处理器类型来实现更灵活的路由功能。示例代码如下:

// 定义自定义处理器类型
type MyHandler struct{}
// 实现处理器接口的ServeHTTP方法
func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Custom Handler")
}
// 创建自定义处理器对象
myHandler := &MyHandler{}
// 注册处理器
http.Handle("/custom", myHandler)

  上面定义了一个自定义处理器类型MyHandler,并在该类型上实现了ServeHTTP方法。当客户端请求路径为"/custom"时,服务器会调用ServeHTTP方法来处理请求并返回"Custom Handler"。

 

标签: GO

相关文章
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
663 61
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
775 35
|
Go
在golang中发起http请求以获取访问域名的ip地址实例(使用net, httptrace库)
这只是追踪我们的行程的简单方法,不过希望你跟着探险家的脚步,即使是在互联网的隧道中,也可以找到你想去的地方。接下来就是你的探险之旅了,祝你好运!
757 26
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
799 0
|
Web App开发 前端开发
|
Web App开发 前端开发 算法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
基于大数据的精准营销与应用场景 2015年08月11日 大数据 大数据营销时代来临营销学领域过去半个多世纪的发展让我们见证了从“以产品为中心”到“以客户为中心”的转变。
1182 0
|
SQL Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
     如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。
1027 0