Reputation: 87
So I'm trying to serve static css and java script to an html template, but the parameters are hindering my ability to do so.
here's my code
package main
import (
"net/http"
"html/template"
"github.com/julienschmidt/httprouter"
"fmt"
)
type PageData struct {
Chapter int
Page int
Source string
}
func main(){
//I'm using the julienschmidt router because it has parameters that I can use
//Create a router
router := httprouter.New()
//Create the route with the parameters
router.GET("/:chapter/:page",paramHandler)
//Create the default route last
router.GET("/",defaultHandler)
//get all of the static files working
router.ServeFiles("/:chapter/:page/*filepath",http.Dir("/js/"))
//http.Handle("/js/",http.StripPrefix("/js/",http.FileServer(http.Dir("./public/js/"))))
//http.Handle("/viewjs/",http.StripPrefix("/viewjs/",http.FileServer(http.Dir("./public/viewjs/"))))
//crate a message telling the user which port the server is running on
fmt.Println("Now serving on port 8080")
//Start the server on the specified port
http.ListenAndServe(":8080",router)
}
func defaultHandler(rw http.ResponseWriter,r *http.Request,p httprouter.Params){
//Parse the html file
index := template.Must(template.ParseFiles("public/index.html"))
chapter := 1
page := 1
//Get data from server
//TODO
//Test Data
//defaultPage := PageData{Chapter:chapter,Page:page,Source:"http://lokeshdhakar.com/projects/lightbox2/images/image-4.jpg"}
//Send the html file to the browser
fmt.Printf("\nThe chapter is %d and the page is %d",chapter,page)
index.Execute(rw,nil)
}
func paramHandler(rw http.ResponseWriter,r*http.Request,p httprouter.Params){
index := template.Must(template.ParseFiles("public/index.html"))
//Get the page parameters
chapter := p.ByName("chapter")
page:= p.ByName("page")
//Get data from server
//TODO
//send the html to the page
fmt.Printf("\nThe chapter is %s and the page is %s",chapter,page)
index.Execute(rw,nil)
}
so basically, I want to serve a different image based on the chapter and page variable (That isn't my current problem, but it is the reason I need the url parameters), but the router thinks that the static file path (the one I use to serve js and css) is full of parameters. I tried to just add "/foo/foo/" to the begging of every path in the html, but that didn't work either Here's a sample output from the console:
from "/"
The chapter is 1 and the page is 1
The chapter is viewjs and the page is index.js
The chapter is viewjs and the page is index.js
from "/1/2"
The chapter is 1 and the page is 2
The chapter is viewjs and the page is index.js
The chapter is viewjs and the page is index.js
here's the repository with all of my files so you can see my project structure.
Thanks!
Upvotes: 2
Views: 1332
Reputation: 2884
I would suggest that you restructure your project files
├── main.go
├── templates/
│ ├── index.html
├── assets/
├── js/
└── react/
Use the following handlers
router.GET("/", defaultHandler)
router.GET("/chapters/:chapter/pages/:page", paramHandler)
router.ServeFiles("/assets/*filepath", http.Dir("assets"))
And change your script sources to include the full path, e.g.
/assets/js/react/build/react.js
Things would be a lot easier if httprouter could match routes like
router.GET("/:chapter/:page", paramHandler)
router.ServeFiles("/*filepath", http.Dir("assets"))
But
Only explicit matches: By design of this router, a request can only match exactly one or no route.
https://github.com/julienschmidt/httprouter#features
Upvotes: 3