Golang net/http库HTTP客户端请求示例

答案:本文介绍了Golang中使用net/http库处理HTTP请求的常见操作。1. 发送GET、POST请求并读取响应;2. 使用http.NewRequest自定义请求头;3. 设置客户端超时时间;4. 处理响应状态码,如200表示成功,404表示资源未找到;5. 通过url.Values构建带查询参数的URL;6. 使用http.Cookie设置和获取Cookie,实现会话管理。

golang net/http库http客户端请求示例

Golang的

net/http

库提供了构建HTTP客户端的强大功能,本文将展示一些实用的请求示例,帮助你快速上手。

解决方案:

package mainimport (    "fmt"    "io"    "log"    "net/http"    "strings")func main() {    // 1. GET 请求示例    getURL := "https://httpbin.org/get"    getResp, err := http.Get(getURL)    if err != nil {        log.Fatalf("GET request failed: %v", err)    }    defer getResp.Body.Close()    getResponseBody, err := io.ReadAll(getResp.Body)    if err != nil {        log.Fatalf("Error reading GET response body: %v", err)    }    fmt.Println("GET Response:", string(getResponseBody))    // 2. POST 请求示例    postURL := "https://httpbin.org/post"    postData := strings.NewReader(`{"key": "value"}`)    postResp, err := http.Post(postURL, "application/json", postData)    if err != nil {        log.Fatalf("POST request failed: %v", err)    }    defer postResp.Body.Close()    postResponseBody, err := io.ReadAll(postResp.Body)    if err != nil {        log.Fatalf("Error reading POST response body: %v", err)    }    fmt.Println("POST Response:", string(postResponseBody))    // 3. 自定义请求头示例    client := &http.Client{}    req, err := http.NewRequest("GET", getURL, nil)    if err != nil {        log.Fatalf("Error creating request: %v", err)    }    req.Header.Set("X-Custom-Header", "MyValue")    customResp, err := client.Do(req)    if err != nil {        log.Fatalf("Custom header request failed: %v", err)    }    defer customResp.Body.Close()    customResponseBody, err := io.ReadAll(customResp.Body)    if err != nil {        log.Fatalf("Error reading custom header response body: %v", err)    }    fmt.Println("Custom Header Response:", string(customResponseBody))    // 4. 设置超时时间    clientWithTimeout := &http.Client{        Timeout: time.Second * 5, // 设置 5 秒超时    }    timeoutURL := "https://httpbin.org/delay/10" // 模拟一个延迟10秒的请求    timeoutResp, err := clientWithTimeout.Get(timeoutURL)    if err != nil {        log.Printf("Timeout request failed: %v", err)    } else {        defer timeoutResp.Body.Close()        timeoutResponseBody, err := io.ReadAll(timeoutResp.Body)        if err != nil {            log.Fatalf("Error reading timeout response body: %v", err)        }        fmt.Println("Timeout Response:", string(timeoutResponseBody))    }}

如何处理HTTP响应的状态码?

HTTP响应状态码是服务器返回的,用来表示请求的结果。常见的处理方式包括:

检查状态码: 使用

resp.StatusCode

获取状态码,并与

http.StatusOK

等常量比较。错误处理: 对于非2xx的状态码,通常需要记录日志、重试请求或向用户显示错误信息。重定向处理: 对于3xx的状态码,可能需要根据

Location

头部进行重定向。

net/http

默认会自动处理一些重定向,但复杂的场景可能需要手动处理。自定义错误: 可以根据业务逻辑,自定义错误类型来处理特定的状态码。

resp, err := http.Get("https://httpbin.org/status/404")if err != nil {    log.Fatal(err)}defer resp.Body.Close()if resp.StatusCode == http.StatusOK {    bodyBytes, err := io.ReadAll(resp.Body)    if err != nil {        log.Fatal(err)    }    bodyString := string(bodyBytes)    fmt.Println(bodyString)} else if resp.StatusCode == http.StatusNotFound {    fmt.Println("Resource not found")} else {    fmt.Printf("Unexpected status code: %dn", resp.StatusCode)}

如何发送带有查询参数的GET请求?

发送带有查询参数的GET请求,可以通过

url.Values

来构建URL,然后使用

http.NewRequest

创建请求。

立即学习“go语言免费学习笔记(深入)”;

package mainimport (    "fmt"    "io"    "log"    "net/http"    "net/url")func main() {    baseURL := "https://httpbin.org/get"    // 构建查询参数    params := url.Values{}    params.Add("param1", "value1")    params.Add("param2", "value2")    // 将查询参数添加到URL    fullURL := baseURL + "?" + params.Encode()    // 创建HTTP客户端    client := &http.Client{}    // 创建GET请求    req, err := http.NewRequest("GET", fullURL, nil)    if err != nil {        log.Fatalf("Error creating request: %v", err)    }    // 发送请求    resp, err := client.Do(req)    if err != nil {        log.Fatalf("Error sending request: %v", err)    }    defer resp.Body.Close()    // 读取响应    body, err := io.ReadAll(resp.Body)    if err != nil {        log.Fatalf("Error reading response: %v", err)    }    fmt.Println("Response:", string(body))}

如何处理HTTP请求中的Cookie?

Cookie的处理涉及到设置和获取。

设置Cookie: 使用

http.Cookie

结构体创建Cookie,然后使用

http.ResponseWriter

Header().Set("Set-Cookie", cookie.String())

方法设置Cookie。在客户端请求中,服务器可以通过响应头来设置 Cookie。获取Cookie: 在客户端,可以使用

Request.Cookie(name string)

方法获取指定的Cookie。如果需要获取所有Cookie,可以使用

Request.Cookies()

方法。

package mainimport (    "fmt"    "log"    "net/http"    "time")func setCookieHandler(w http.ResponseWriter, r *http.Request) {    cookie := &http.Cookie{        Name:     "my_cookie",        Value:    "cookie_value",        Path:     "/",        Domain:   "localhost", // 实际应用中应设置为你的域名        Expires:  time.Now().Add(24 * time.Hour),        Secure:   false, // 如果是HTTPS,应设置为true        HttpOnly: true,  // 防止客户端脚本访问    }    http.SetCookie(w, cookie)    fmt.Fprintln(w, "Cookie has been set")}func getCookieHandler(w http.ResponseWriter, r *http.Request) {    cookie, err := r.Cookie("my_cookie")    if err != nil {        if err == http.ErrNoCookie {            fmt.Fprintln(w, "Cookie not found")            return        }        log.Println("Error getting cookie:", err)        http.Error(w, "Internal server error", http.StatusInternalServerError)        return    }    fmt.Fprintf(w, "Cookie value: %sn", cookie.Value)}func main() {    http.HandleFunc("/set_cookie", setCookieHandler)    http.HandleFunc("/get_cookie", getCookieHandler)    fmt.Println("Server listening on :8080")    log.Fatal(http.ListenAndServe(":8080", nil))}

以上就是Golang net/http库HTTP客户端请求示例的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1404289.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月15日 20:21:41
下一篇 2025年12月15日 20:21:57

相关推荐

  • Golang在云原生环境中优化网络通信

    Go语言通过连接复用、gRPC、异步超时控制和可观测性优化云原生网络性能,提升微服务通信效率与稳定性。 Go语言凭借其轻量级协程、高效的调度器和原生支持并发的特性,成为云原生应用开发的首选语言之一。在容器化、微服务和Kubernetes等云原生架构中,网络通信频繁且对性能要求高,因此优化Go应用的网…

    好文分享 2025年12月15日
    000
  • 如何使用Golang的select语句监听多个channel的事件

    Golang中通过select语句监听多个channel,实现并发控制、超时与非阻塞操作,并利用done channel或context.Context优雅关闭goroutine。 在Golang中,要同时监听多个channel的事件,我们主要依赖 select 语句。它提供了一种机制,让gorou…

    2025年12月15日
    000
  • Golang微服务负载均衡与路由策略

    答案:微服务中Golang需结合服务发现、负载均衡与路由策略实现高可用。首先通过Consul或Kubernetes等实现服务注册与发现,确保动态获取实例列表;其次在客户端或代理层实现轮询、随机、最少连接等负载均衡算法,提升资源利用率;再结合元数据(如版本、区域)实现智能路由,支持灰度发布与A/B测试…

    2025年12月15日
    000
  • Golang使用testing.B进行循环性能测试

    Golang中的testing.B用于基准测试,通过编写Benchmark函数并利用b.N、b.ResetTimer()等方法,可准确测量循环性能;结合-benchmem能分析内存分配,帮助识别算法效率、GC压力等瓶颈;需避免编译器优化、计时器未重置等陷阱,结合pprof和真实场景数据进行优化决策,…

    2025年12月15日
    000
  • Golang指针基础概念与内存分配

    指针存储变量内存地址,通过&取地址、*解引用,实现高效数据操作与函数间共享修改;Go通过逃逸分析决定栈或堆分配,指针协助GC追踪可达性,提升内存安全与性能。 在Go语言里,指针是一个相当核心但也常常让人有点摸不着头脑的概念。简单来说,它不是直接存储数据,而是存储数据在内存中的地址。理解指针,…

    2025年12月15日
    000
  • Golang初级项目中WebSocket实时通信实现

    使用gorilla/websocket库实现Go语言WebSocket通信,1. 安装依赖并初始化模块;2. 配置Upgrader处理HTTP升级;3. 编写handleWebSocket函数处理消息收发;4. 通过http.HandleFunc注册/ws路由;5. 前端用new WebSocket…

    2025年12月15日
    000
  • Golang在DevOps流水线中应用实践

    Go语言因语法简洁、编译高效和并发支持好,被广泛用于DevOps工具链。其静态编译特性生成无依赖的二进制文件,便于跨平台部署,适合构建CI/CD辅助工具。通过os/exec调用shell命令,结合flag或cobra构建CLI,提升易用性。Go常用于编写部署脚本与配置同步工具,利用goroutine…

    2025年12月15日
    000
  • 怎么解决go get时出现xxx is deprecated的问题

    当你在Go项目中遇到“xxx is deprecated”这样的提示时,这通常意味着你正在使用的某个包、模块、函数或方法已经被其维护者标记为不再推荐使用。这不一定是一个错误,但它是一个明确的信号,告诉你未来可能需要采取行动,因为这个功能可能在未来的版本中被移除或替换。最直接的解决思路是理解这个弃用背…

    2025年12月15日
    000
  • Golang中如何使用sync.Once确保初始化代码只执行一次

    使用sync.Once可确保初始化代码在并发环境下仅执行一次。它通过Do方法实现线程安全的懒加载,适用于数据库连接池等需单次初始化的场景;与init()函数不同,sync.Once支持运行时延迟初始化,且天生应对并发,但需注意初始化函数panic会导致永久失败,且无法重试或重置。 在Golang中,…

    2025年12月15日
    000
  • Golangchannel在生产者消费者模型中的应用

    Golang Channel通过内置同步、原子性数据传递和调度器优化,实现高效安全的生产者消费者模型;选择合适缓冲区可平衡吞吐与延迟,关闭时应由生产者方负责并确保所有数据处理完毕,避免死锁与数据丢失。 Golang的Channel机制,在我看来,是实现并发生产者消费者模型时最直观、最优雅的解决方案之…

    2025年12月15日
    000
  • Go语言自定义类型:理解类型转换与工厂函数实践

    本文深入探讨Go语言中自定义类型的定义与初始化。我们将澄清uint8()等并非构造函数而是类型转换,并演示如何直接转换基础类型到自定义类型。对于需要复杂初始化逻辑的自定义类型,文章将详细介绍如何使用工厂函数(如makeMyType)进行构建,并明确区分makeX与newX的命名约定,以编写出更符合G…

    2025年12月15日
    000
  • Golang flag库命令行参数解析与使用

    Golang flag库是处理命令行参数最直接的方式,核心步骤为定义、解析和使用参数。通过import “flag”引入后,使用flag.String、flag.Int等方法定义参数,支持默认值和说明;在main中调用flag.Parse()完成解析,指针解引用获取值。支持非…

    2025年12月15日
    000
  • Golang文件上传下载功能网络实现

    首先利用net/http包创建HTTP服务,通过POST接口上传文件并保存,再通过GET接口读取文件实现下载。具体为:注册/upload处理POST请求,解析multipart/form-data表单,获取文件流并写入本地;注册/download接口,校验文件名安全性后设置Content-Dispo…

    2025年12月15日
    000
  • Golang初级项目中JSON解析与处理

    Go语言通过encoding/json实现JSON处理,使用结构体字段标签如json:”name”进行序列化与反序列化,字段需大写以导出,配合json.Marshal和json.Unmarshal完成数据转换;对于动态结构,可用map[string]interface{}解析…

    2025年12月15日
    000
  • Golang测试中使用临时数据库进行验证

    使用临时数据库是Go测试的最佳实践,它通过提供隔离、干净的环境避免数据污染,提升测试可靠性与速度。常见方案包括SQLite内存数据库用于单元测试,或Testcontainers结合Docker启动真实数据库实例用于集成测试。通过testing.T.Cleanup管理生命周期、自动化Schema迁移与…

    2025年12月15日
    000
  • grafana默认用户名密码是什么

    Grafana默认用户名和密码均为admin,便于用户快速上手,但存在严重安全风险,如未及时修改可能导致未授权访问、数据泄露、系统完整性受损及合规问题;建议首次登录后立即更改密码,并通过grafana-cli命令行工具重置遗忘的密码;为提升安全性,应禁用默认admin账户、创建新管理员账号,并在gr…

    2025年12月15日
    000
  • Golang基本数据类型及默认值说明

    Go语言中的基本数据类型包括数值类型、布尔类型和字符串类型,每种类型在声明未初始化时都有确定的默认值(零值)。了解这些类型及其默认值有助于编写更安全、可预测的代码。 数值类型及默认值 Go的数值类型分为整型、浮点型、复数型和字节类型,它们的默认值均为 0。 整型:int、int8、int16、int…

    2025年12月15日
    000
  • Golang context上下文 超时与取消控制

    context用于控制协程生命周期,传递取消信号与超时,避免泄漏;通过WithCancel创建可取消context,调用cancel()关闭Done通道,使监听协程退出。 在Go语言开发中,context 是控制协程生命周期的核心工具,尤其在处理超时和取消操作时非常关键。它能帮助我们在请求链路中统一…

    2025年12月15日
    000
  • Golang初级项目中HTTP客户端请求处理

    首先使用net/http包发起GET请求并确保关闭响应体;接着创建带超时的自定义客户端提升健壮性;然后通过NewRequest发送带JSON数据的POST请求并设置头信息;最后检查状态码并处理错误。关键点包括资源释放、超时设置、错误处理和状态码判断,确保HTTP通信稳定可靠。 在Go语言的初级项目中…

    2025年12月15日
    000
  • Golang日志记录与错误处理结合实践

    答案:Go中应封装统一的日志与错误处理,使用zap等结构化日志库,结合上下文信息如trace_id、用户标识等增强可追溯性,分级别记录日志,避免重复记录和敏感信息泄露,通过fmt.Errorf使用%w保留错误链,实现可观测性强的健壮系统。 在Go语言开发中,日志记录与错误处理是保障程序健壮性和可维护…

    2025年12月15日
    000

发表回复

登录后才能评论
关注微信