Go中 net/http 使用

go,net,http,使用 · 浏览次数 : 145

小编点评

**HTTP 客户端和服务器** **HTTP 客户端** * 创建一个 HTTP客户端对象。 * 通过其 `Get` 方法发送 HTTP 请求并接收响应。 * 关闭响应体。 **HTTP 服务器** * 创建一个 HTTP服务器。 * 注册一个处理器函数处理所有 HTTP 请求。 * 使用 `ListenAndServe` 方法启动服务器。 * 处理请求并返回响应。 **路由** * 使用 `http.HandleFunc` 或 `http.Handle` 方法注册路由处理函数。 * 路由根据请求路径匹配相应的处理器函数。

正文

转载请注明出处:

  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.HandleFunchttp.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中 net/http 使用相似的内容:

Go中 net/http 使用

转载请注明出处: net/http是Go语言标准库中的一个包,提供了实现HTTP客户端和服务器的功能。它使得编写基于HTTP协议的Web应用程序变得简单和方便。 net/http包的主要用途包括: 实现HTTP客户端:可以发送HTTP请求并接收服务器的响应。 实现HTTP服务器:可以创建一个HTTP

golang 的 net/http 和 net/rpc 的区别, rpc 效率比 http 高?

在Go语言中,net/http 和 net/rpc 是两个不同的包,它们分别用于实现不同的网络通信模式: net/http: net/http 包主要用于构建Web服务和客户端,它实现了HTTP协议,这是互联网上最广泛使用的应用层协议之一,主要用于传输超文本(HTML)和其他资源。 HTTP 协议是

go项目实现mysql接入以及web api

本文为博主原创,转载请注明出处: 创建go项目,并在go项目中接入mysql,将mysql的配置项单独整理放到一个胚子和文件中,支持项目启动时,通过加载配置文件中的值,然后创建数据库连接。 之后使用net/http相关的库,创建路由,并在路由中通过不同的http方法,实现mysql连接的test数据

validator库在gin中的使用

目录封装语言包翻译器tag中设置验证规则控制层验curl请求返回结果 封装语言包翻译器 package validator import ( "fmt" "net/http" "reflect" "github.com/go-playground/locales/zh_Hans_CN" unTran

go创建web项目分别在windows和linux部署

转载请注明出处: 1.通过idea 创建go项目,并指定go版本,以及创建main.go 的入口类 创建的项目名称为:go_web_test1, main.go 中代码如下: package main import ( "fmt" "net/http" ) func handler(w http.R

GO 中的时间操作(time & dateparse)【GO 基础】

本文通过 GO 的标准库 time 和 三方库 dateparse 的详解,梳理了关于时间的全部操作。

Go 语言中的异常处理简单实践 panic、recover【GO 基础】

〇、Go 中的异常处理简介 Golang 没有结构化异常,使用 panic 抛出错误,recover 捕获错误。 panic、recover 参数类型为 interface{},因此可抛出任何类型对象。 func panic(v interface{}) func recover() interfa

在Go中如何实现并发

Go语言的并发机制是其强大和流行的一个关键特性之一。Go使用协程(goroutines)和通道(channels)来实现并发编程,这使得编写高效且可维护的并发代码变得相对容易。下面是Go的并发机制的详细介绍: 协程(Goroutines): 协程是Go中的轻量级线程,由Go运行时管理。与传统线程相比

Go通道机制与应用详解

本文深入探讨了Go语言中通道(Channel)的各个方面,从基础概念到高级应用。文章详细解析了通道的类型、操作方法以及垃圾回收机制,更进一步通过具体代码示例展示了通道在数据流处理、任务调度和状态监控等多个实际应用场景中的作用。本文旨在为读者提供一个全面而深入的理解,以更有效地使用Go中的通道进行并发

Go字符串实战操作大全!

在本篇文章中,我们深入探讨了Go语言中字符串的魅力和深度。从基础定义、操作、字符编码到复杂的类型转换,每个环节都带有实例和代码示例来深化理解。通过这些深入的解析,读者不仅能够掌握字符串在Go中的核心概念,还能洞察Go设计哲学背后的思考。 关注公众号【TechLeadCloud】,分享互联网架构、云服