duanhuren5581
2016-02-25 14:36
浏览 185
已采纳

使用github.com/julienschmidt/httprouter在Golang中使用参数时提供静态CSS和Java脚本

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("
The 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("
The 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条回答 默认 最新

  • dongweng6241 2016-02-25 15:57
    已采纳

    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

    打赏 评论

相关推荐 更多相似问题