简体   繁体   English

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

[英]Serving static css and java script while using parameters in Golang using github.com/julienschmidt/httprouter

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. 因此,我试图将静态CSS和Java脚本提供给html模板,但参数阻碍了我这样做的能力。

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. 所以基本上,我想基于Chapter和Page变量提供不同的图像(这不是我当前的问题,但这是我需要url参数的原因),但是路由器认为静态文件路径(一个我用来提供js和CSS的参数已满。 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: 我试图将“ / foo / foo /”添加到html中每个路径的开头,但这都不起作用。这是控制台的示例输出:

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" 来自“ / 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! 谢谢!

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, eg 并更改脚本源以包含完整路径,例如

/assets/js/react/build/react.js

Things would be a lot easier if httprouter could match routes like 如果httprouter可以匹配以下路由,则事情会容易得多

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 https://github.com/julienschmidt/httprouter#features

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM