首页 > 后端开发 > Golang > 正文

Golang HTTP GET 请求返回 404 错误排查与解决

碧海醫心
发布: 2025-10-07 11:21:41
原创
294人浏览过

golang http get 请求返回 404 错误排查与解决

本文旨在帮助开发者解决在使用 Golang 的 net/http 包发送 HTTP GET 请求时,遇到返回 404 Not Found 错误的问题。通过分析问题原因,并提供相应的解决方案,帮助开发者避免类似错误,确保 HTTP 请求的正确执行。主要聚焦于 URL 编码处理,特别是当 URL 中包含特殊字符时,Golang 的默认处理方式与 cURL 等工具的差异,以及如何通过调整编码或使用 Opaque URL 来解决问题。

在使用 Golang 的 net/http 包发送 HTTP GET 请求时,开发者有时会遇到返回 404 Not Found 错误,即使同样的 URL 在 cURL 等工具中可以正常访问。这通常是由于 Golang 的 HTTP 客户端对 URL 中的特殊字符进行了自动解码,导致服务器无法正确识别请求路径。

问题分析

Golang 的 net/http 包在创建新的 HTTP 请求时,会对 URL 进行一定的处理,包括将 URL 编码的字符解码为原始字符。例如,%2F 会被解码为 /,%3D 会被解码为 =。虽然这种自动解码在很多情况下是方便的,但在某些情况下,服务器可能期望接收到原始的 URL 编码字符,而不是解码后的字符。

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

解决方案

针对上述问题,可以采用以下两种解决方案:

  1. 修改 URL 编码

    如果 URL 中包含的特殊字符需要保持 URL 编码状态,则需要对这些字符进行双重编码。例如,如果 URL 中需要包含 %2F,则需要将其替换为 %252F。这样,Golang 的 HTTP 客户端在解码时,会将 %252F 解码为 %2F,从而保证服务器接收到正确的 URL 编码字符。

    Smart Picture
    Smart Picture

    Smart Picture 智能高效的图片处理工具

    Smart Picture 77
    查看详情 Smart Picture
  2. 使用 Opaque URL

    net/url 包中的 URL 结构体提供了一个 Opaque 字段,用于存储不透明的 URL 字符串。当使用 Opaque URL 时,Golang 的 HTTP 客户端不会对 URL 进行任何解码操作,而是直接将 Opaque 字段的值作为请求的 URL。

    以下是使用 Opaque URL 的示例代码:

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "net/http"
        "net/url"
    )
    
    func main() {
        urlString := "http://example.com/path%2Fwith%2Fencoded%2Fslashes"
    
        u, err := url.Parse(urlString)
        if err != nil {
            fmt.Println("Error parsing URL:", err)
            return
        }
    
        // 使用 Opaque URL 绕过自动解码
        u.Opaque = u.Path
        u.Path = ""
    
        req := &http.Request{
            Method: "GET",
            URL:    u,
            Proto:  "HTTP/1.0",
            ProtoMajor: 1,
            ProtoMinor: 0,
            Header: make(http.Header),
        }
    
        client := &http.Client{}
        resp, err := client.Do(req)
        if err != nil {
            fmt.Println("Error sending request:", err)
            return
        }
        defer resp.Body.Close()
    
        body, err := ioutil.ReadAll(resp.Body)
        if err != nil {
            fmt.Println("Error reading response body:", err)
            return
        }
    
        fmt.Println("Response Status:", resp.Status)
        fmt.Println("Response Body:", string(body))
    }
    登录后复制

    代码解释:

    1. url.Parse(urlString): 首先使用 url.Parse 函数解析包含特殊字符的 URL 字符串。
    2. u.Opaque = u.Path: 将解析后的 URL 的 Path 赋值给 Opaque 字段。
    3. u.Path = "": 将 Path 设置为空,这样请求时就会使用 Opaque 的值。
    4. 创建一个 http.Request 对象,并将 URL 字段设置为修改后的 u。
    5. 发送 HTTP 请求,并处理响应。

注意事项

  • 在使用 Opaque URL 时,需要确保 Opaque 字段的值是完整的 URL 路径,包括任何必要的 URL 编码字符。
  • 在某些情况下,服务器可能对 URL 中的特殊字符有特定的要求,需要根据实际情况进行调整。

总结

当 Golang 的 HTTP GET 请求返回 404 错误时,需要检查 URL 中是否包含特殊字符,并根据服务器的要求选择合适的解决方案。通过修改 URL 编码或使用 Opaque URL,可以避免 Golang 的 HTTP 客户端对 URL 进行自动解码,从而保证请求的正确执行。

以上就是Golang HTTP GET 请求返回 404 错误排查与解决的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号