[Golang] JSONP Server Implementation Code
My previous posts [4] shows how to use JSONP in front-end to request data from a server in different domain. In this post, we will show how to implement the back-end server that returns data (HTTP request headers) with Go programming language.
You need to have some basic knowledge about writing web applications in Go. Please refer to [2] if you have no idea about Go web applications.
The basic idea of JSONP server is as follows:
- Get the name of front-end callback function from the query string in HTTP request.
- Encode the data to be returned to the client in JSON format. In this case, it's the HTTP headers encoded in JSON.
- Set the Content-Type as application/javascript in HTTP response.
- return the string callbackName(JSONString); to the client, where callbackName is the name of callback in query string, and JSONString is the JSON-encoded data in step 2.
The complete implementation in Go is as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package main import ( "encoding/json" "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, indexHtml) } func jsonpHandler(w http.ResponseWriter, r *http.Request) { callbackName := r.URL.Query().Get("callback") if callbackName == "" { fmt.Fprintf(w, "Please give callback name in query string") return } b, err := json.Marshal(r.Header) if err != nil { fmt.Fprintf(w, "json encode error") return } w.Header().Set("Content-Type", "application/javascript") // return `callbackName(jsonString);` fmt.Fprintf(w, "%s(%s);", callbackName, b) } func main() { http.HandleFunc("/jsonp", jsonpHandler) http.HandleFunc("/", handler) http.ListenAndServe(":8000", nil) } |
The front-end code for this JSONP server is as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package main const indexHtml = `<!DOCTYPE html> <html> <head><title>Go JSONP Server</title></head> <body> <button id="btn">Click to get HTTP header via JSONP</button> <pre id="result"></pre> <script> 'use strict'; var btn = document.getElementById("btn"); var result = document.getElementById("result"); function myCallback(acptlang) { result.innerHTML = JSON.stringify(acptlang, null, 2); } function jsonp() { result.innerHTML = "Loading ..."; var tag = document.createElement("script"); tag.src = "/jsonp?callback=myCallback"; document.querySelector("head").appendChild(tag); } btn.addEventListener("click", jsonp); </script> </body> </html>` |
Tested on:
- Ubuntu Linux 16.10
- Go 1.8
- Chromium Version 56.0.2924.76 Built on Ubuntu , running on Ubuntu 16.10 (64-bit)
References:
[1] |
[2] |
[3] | JSON and Go - The Go Blog |
[4] |