如何在不使用Golang中的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