2

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!

1
  • Currently there are no images. The /js/ folder contains things like reactjs and jQuery sources. The viewjs files are my react classes. Those are what I'm having trouble serving at the moment. Sorry if my wording confused you. I'll change that. Thanks. Commented Feb 25, 2016 at 15:43

1 Answer 1

3

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

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.