Вы можете сделать это, используя пакет html / template в стандартной библиотеке Go.
Основной процесс здесь такой:
- Написать шаблон (in go / язык шаблона HTML)
- Читать в шаблоне (используя
template.ParseFiles
или аналогичный) - Прослушивать запросы
- Передавать информацию из соответствующих запросов в ваш шаблон (используя
ExecuteTemplate
или аналогичный)
Вы можете передать структуру в ExecuteTemplate
, которая затем будет доступна в определяемом вами шаблоне (см. Пример ниже).Например, если ваша структура имеет поле с именем Name
, тогда вы можете получить доступ к этой информации в шаблоне с помощью {{ .Name }}
.
Вот пример:
main.go :
основной пакет
import (
"log"
"encoding/json"
"html/template"
"net/http"
)
var tpl *template.Template
func init() {
// Read your template(s) into the program
tpl = template.Must(template.ParseFiles("index.gohtml"))
}
func main() {
// Set up routes
http.HandleFunc("/endpoint", EndpointHandler)
http.ListenAndServe(":8080", nil)
}
// define the expected structure of payloads
type Payload struct {
Name string `json:"name"`
Hobby string `json:"hobby"`
}
func EndpointHandler(w http.ResponseWriter, r *http.Request) {
// Read the body from the request into a Payload struct
var payload Payload
err := json.NewDecoder(r.Body).Decode(&payload)
if err != nil {
log.Fatal(err)
}
// Pass payload as the data to give to index.gohtml and write to your ResponseWriter
w.Header().Set("Content-Type", "text/html")
tpl.ExecuteTemplate(w, "index.gohtml", payload)
}
index.gohtml :
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div>
<span>Your name is</span><span>{{ .Name }}</span>
</div>
<div>
<span>Your hobby is</span><span>{{ .Hobby }}</span>
</div>
</body>
</html>
Образец:
Сполезная нагрузка:
{
"name": "Ahmed",
"hobby": "devving"
}
Ответ:
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div>
<span>Your name is</span>
<span>Ahmed</span>
</div>
<div>
<span>Your hobby is</span>
<span>devving</span>
</div>
</body>
</html>
Обратите внимание, что это довольно хрупко, поэтому вам определенно следует добавить лучшую обработку ошибок и крайних случаев, но, надеюсь, это полезная отправная точка.