這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
一、後端部分
要想使用ajax,先要準備一個func (http.ResponseWriter, *http.Request)類型的函數來處理前端發過來的請求。
func OnAjax(res http.ResponseWriter, req *http.Request) { io.WriteString(res, "這是從後台發送的資料")}
接下來,要把一個網址和它對應起來,例如首頁下的“/ajax”:
http.HandleFunc("/ajax", OnAjax)
二、HTML部分
網頁上的內容很簡單,只有一個按鈕和一個文字輸入框。
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <meta charset="utf-8" /> <title>Go語言與ajax樣本</title> <script type="text/javascript" src="js/loli.js"></script></head><body> <p><input id="btn1" type="button" value="按鈕" /></p> <p><input id="txt1" type="text" /></p></body></html>
三、js部分
這部分沒什麼好說的,就是XMLHttpRequest那點事。
window.onload = main;function main() { var oBtn = document.getElementById('btn1'); oBtn.onclick = OnButton1;}function OnButton1() { var xhr = new XMLHttpRequest(); xhr.open('get', '/ajax', true); xhr.send(); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { // 讀取完成 if (xhr.status == 200) { var oTxt = document.getElementById('txt1'); oTxt.value = xhr.responseText; } } }}
收到伺服器傳過來的資料後,在輸入框上就可以看到文字了。
四、完整Go代碼
package mainimport ( "bytes" "errors" "fmt" "html/template" "io" "net/http" "runtime")// 連接埠const ( HTTP_PORT string = "80" HTTPS_PORT string = "443")// 目錄const ( CSS_CLIENT_PATH = "/css/" DART_CLIENT_PATH = "/js/" IMAGE_CLIENT_PATH = "/image/" CSS_SVR_PATH = "web" DART_SVR_PATH = "web" IMAGE_SVR_PATH = "web")func init() { runtime.GOMAXPROCS(runtime.NumCPU())}func main() { // 先把css和指令碼服務上去 http.Handle(CSS_CLIENT_PATH, http.FileServer(http.Dir(CSS_SVR_PATH))) http.Handle(DART_CLIENT_PATH, http.FileServer(http.Dir(DART_SVR_PATH))) // 網址與處理邏輯對應起來 http.HandleFunc("/", HomePage) http.HandleFunc("/ajax", OnAjax) // 開始服務 err := http.ListenAndServe(":"+HTTP_PORT, nil) if err != nil { fmt.Println("服務失敗 /// ", err) }}func WriteTemplateToHttpResponse(res http.ResponseWriter, t *template.Template) error { if t == nil || res == nil { return errors.New("WriteTemplateToHttpResponse: t must not be nil.") } var buf bytes.Buffer err := t.Execute(&buf, nil) if err != nil { return err } res.Header().Set("Content-Type", "text/html; charset=utf-8") _, err = res.Write(buf.Bytes()) return err}func HomePage(res http.ResponseWriter, req *http.Request) { t, err := template.ParseFiles("web/loli.html") if err != nil { fmt.Println(err) return } err = WriteTemplateToHttpResponse(res, t) if err != nil { fmt.Println(err) return }}func OnAjax(res http.ResponseWriter, req *http.Request) { io.WriteString(res, "這是從後台發送的資料")}