php小編草莓將為大家介紹如何在Go語言中通過TCP連接發(fā)出HTTP請求。在網(wǎng)絡(luò)開發(fā)中,我們常常需要與其他服務(wù)器進行通信,并獲取數(shù)據(jù)或發(fā)送請求。Go語言提供了豐富的標(biāo)準(zhǔn)庫,其中包含了用于創(chuàng)建TCP連接和發(fā)送HTTP請求的功能。通過掌握這些技巧,我們可以輕松地在Go語言中實現(xiàn)與其他服務(wù)器的通信,實現(xiàn)數(shù)據(jù)的獲取和發(fā)送。接下來,讓我們一起來深入了解這個有趣的主題吧!
問題內(nèi)容
package main
import (
"crypto/tls"
"fmt"
)
func main() {
conf := &tls.Config{}
conn, _ := tls.Dial("tcp", "www.google.com:443", conf)
data := []byte("GET / HTTP1.1\r\nHost: www.google.com\r\n\r\n")
conn.Write(data)
buf := make([]byte, 5000)
conn.Read(buf)
fmt.Println(string(buf[:]))
}
登錄后復(fù)制
我嘗試通過原始 tcp 連接數(shù)據(jù)發(fā)出 http 請求,但收到 400 bad request 的錯誤響應(yīng),這是什么問題。
解決方法
數(shù)據(jù)中有錯誤。
http1.1 應(yīng)為 http/1.1。
我想分享一下我是如何發(fā)現(xiàn)這個拼寫錯誤的,希望對其他人有幫助。
當(dāng)我想要解決一個我不太熟悉的問題時,我做的第一件事就是找出它工作時的樣子。我之前使用過 nc ,所以我先嘗試一下。
這是 nc 手冊頁中的示例:
$ printf "get / http/1.0\r\n\r\n" | nc host.example.com 80
登錄后復(fù)制
所以我首先將 host.example.com 替換為 www.google.com :
$ printf "get / http/1.0\r\n\r\n" | nc www.google.com 80
登錄后復(fù)制
它有效!
然后將 http/1.0 替換為 http/1.1。仍然有效!
然后添加 host 標(biāo)頭:
$ printf "get / http/1.1\r\nhost: www.google.com\r\n\r\n" | nc www.google.com 80
登錄后復(fù)制
有效!
然后復(fù)制問題中的字符串:
$ printf "GET / HTTP1.1\r\nHost: www.google.com\r\n\r\n" | nc www.google.com 80
登錄后復(fù)制
這次得到了 400 錯誤請求。
這是向前邁出的一大步!請求中有問題。通過比較兩個請求很容易發(fā)現(xiàn)拼寫錯誤。
最后,修復(fù)原始演示中的拼寫錯誤,并運行演示以驗證問題是否已得到解決。完成!
感謝您的閱讀!






