问题描述
我正在尝试学习系统编程。我想知道如何在不使用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