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