登录
首页 >  Golang >  Go问答

不依赖Golang的HTTP库如何获取HTTP响应?

来源:stackoverflow

时间:2024-03-23 18:09:26 188浏览 收藏

不依赖任何库的情况下获取 HTTP 响应,可以通过直接使用套接字的方式实现。HTTP 协议较为简单,通过 net 包的 Dial 函数建立连接,并使用 HTTP 1.1 协议发送 GET 请求,即可获取响应。然而,HTTP 协议包含多种选项和变体,实现完整的 HTTP 功能需要大量的工作和调整。

问题内容

我正在尝试学习系统编程。我想知道如何在不使用 HTTP 等任何库的情况下对 URL 发出 GET 请求。任何帮助将不胜感激!


解决方案


如果你直接使用套接字,这会非常简单; http 是一个非常简单的协议。以下是在端口 80 处到给定主机的 http get(使用 http 1.1):

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net"
    "net/url"
    "os"
)

func main() {
    s := os.Args[1]
    u, err := url.Parse(s)
    if err != nil {
        log.Fatal(err)
    }

    conn, err := net.Dial("tcp", u.Host+":80")
    if err != nil {
        log.Fatal(err)
    }

    rt := fmt.Sprintf("GET %v HTTP/1.1\r\n", u.Path)
    rt += fmt.Sprintf("Host: %v\r\n", u.Host)
    rt += fmt.Sprintf("Connection: close\r\n")
    rt += fmt.Sprintf("\r\n")

    _, err = conn.Write([]byte(rt))
    if err != nil {
        log.Fatal(err)
    }

    resp, err := ioutil.ReadAll(conn)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(resp))

    conn.Close()
}

也就是说,整个 http 协议有许多不同的选项和变体,需要花费大量的时间、精力和调整来实现。

go 源代码通常相当容易理解,因此您可以阅读 net/http 的代码。还有使用较低层实现的替代 http 包,例如 https://github.com/valyala/fasthttp

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《不依赖Golang的HTTP库如何获取HTTP响应?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>