I started learning Go recently. I got a sample like as web app. I have:
/* tick-tock.go */
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
// Content for the main html page..
var page = `<html>
<head>
<script type="text/javascript"
src="http://localhost:8081/jquery.min.js">
</script>
<style>
div {
font-family: "Times New Roman", Georgia, Serif;
font-size: 1em;
width: 13.3em;
padding: 8px 8px;
border: 2px solid #2B1B17;
color: #2B1B17;
text-shadow: 1px 1px #E5E4E2;
background: #FFFFFF;
}
</style>
</head>
<body>
<h2 align=center>Go Timer </h2>
<div id="output" style="width: 30%; height: 63%; overflow-y: scroll; float:left;"></div>
<div id="v1" style="width: 50%; height: 30%; overflow-y: scroll; float:left;"></div>
<div id="v2" style="width: 50%; height: 30%; overflow-y: scroll; float:left;"></div>
<input id="sett" type="submit" name="sett" value="Settings" onclick="changeUrl()">
<script type="text/javascript">
var myDelay;
$(document).ready(function ()
{
$("#output").append("Waiting for system time..");
myDelay = setInterval("delayedPost()", 1000);
});
function delayedPost()
{
$.post("http://localhost:9999/dev", "", function(data, status)
{
//$("#output").empty();
$("#output").prepend(data);
});
$.post("http://localhost:9999/v1", "", function(data, status) {
//$("#output").empty();
$("#v1").prepend(data);
});
$.post("http://localhost:9999/v2", "", function(data, status) {
//$("#output").empty();
$("#v2").prepend(data);
});
}
function delayedPost1()
{
$.post("http://localhost:9999/dev", "", function(data, status)
{
$("#output").prepend(data);
});
$.post("http://localhost:9999/v1", "", function(data, status)
{
$("#v1").prepend(data);
});
$.post("http://localhost:9999/v3", "", function(data, status)
{
$("#v2").prepend(data);
});
}
function changeUrl()
{
alert('salom');
clearInterval(myDelay);
}
</script>
</body>
</html>`
// handler for the main page.
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, page)
}
// handler to cater AJAX requests
func handlerDevs(w http.ResponseWriter, r *http.Request) {
//fmt.Fprint(w, time.Now().Format("Mon, 02 Jan 2006 15:04:05 MST"))
fmt.Fprint(w, "<font color=red>Dev1<br></font>")
}
func handlerV1(w http.ResponseWriter, r *http.Request) {
//fmt.Fprint(w, time.Now().Format("Mon, 02 Jan 2006 15:04:05 MST"))
fmt.Fprint(w, "<font color=blue>Vertical1<br></font>")
}
func handlerV2(w http.ResponseWriter, r *http.Request) {
//fmt.Fprint(w, time.Now().Format("Mon, 02 Jan 2006 15:04:05 MST"))
fmt.Fprint(w, "<font color=green>Vertical2<br></font>")
}
func main() {
http.HandleFunc("/", handler)
http.HandleFunc("/dev", handlerDevs)
http.HandleFunc("/v1", handlerV1)
http.HandleFunc("/v2", handlerV2)
log.Fatal(http.ListenAndServe(":9999", nil))
http.HandleFunc("/jquery.min.js", SendJqueryJs)
panic(http.ListenAndServe(":8081", nil))
}
func SendJqueryJs(w http.ResponseWriter, r *http.Request) {
data, err := ioutil.ReadFile("jquery.min.js")
if err != nil {
http.Error(w, "Couldn't read file", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/javascript")
w.Write(data)
}
I couldn't load local jquery.min.js
. When I wrote src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"
it was loaded. How can I load local js file? I am not good at coding in Go and I did not write full code. So please try to explain very simple. Thanks in advance!
You need a Handler
or a HandlerFunc
which will send the file content (jquery.min.js
) to the web browser when requested.
You have 3 options:
This is the more complex solution. It would look like in your handler function you read the content of the file, set proper response content type (application/javascript
) and send the content (which is a []byte
) to the response.
Things to look out for: When reading the file, you have to specify an absolute path. If you specify a relative path, be sure the file is in the current folder (working directory) you start your app from.
Example:
func SendJqueryJs(w http.ResponseWriter, r *http.Request) {
data, err := ioutil.ReadFile("jquery.min.js")
if err != nil {
http.Error(w, "Couldn't read file", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/javascript; charset=utf-8")
w.Write(data)
}
func main() {
http.HandleFunc("/jquery.min.js", SendJqueryJs)
panic(http.ListenAndServe(":8081", nil))
}
The above example is capable of serving only 1 file: jquery.min.js
for the request:
http://localhost:8081/jquery.min.js
http.ServeFile()
This is much easier: The function http.ServeFile()
is capable of sending the content of one file to the specified response. You still need to create a function or handler to use it, but it does the rest for you:
func SendJqueryJs(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "jquery.min.js")
}
http.FileServer()
If you need to serve multiple static files, this is where FileServer()
function comes handy which returns you a Handler
which automatically serves files from your local file system that are descendants of the root folder you specify.
This solution is much more flexible: it can send many files of multiple types, detects and sets content type automatically. The handler is also capable of rendering HTML pages for listing directory content with links to the files and to parent/child folders.
Example:
http.Handle("/tmpfiles/",
http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))
This will register a Handler
at the URL /tmpfiles/
which serves files found in your local filesystem in the /tmp
folder. So for example the following <script>
link:
<script type="text/javascript" src="/tmpfiles/jquery.min.js">
Will get the /tmp/jsquery.min.js
file from the server.
Check out this answer which details how to use/fire up a Static File Server.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With