如何在Golang中将URL传递给fasthttp-router?

huangapple go评论113阅读模式
英文:

How to pass an URL to a fasthttp-router, in Golang?

问题

该应用程序的功能是将一个bash命令输出到缓冲区。注意:参数是url

对于简单的情况,比如:"duckduckgo",即http://localhost:8080/free-riding/duckduckgo可以正常工作。

输出结果:

  1. #[1]DuckDuckGo (HTML)
  2. [2]About DuckDuckGo
  3. ____________________ Submit
  4. References
  5. 1. https://duckduckgo.com/opensearch_html_v2.xml
  6. 2. https://duckduckgo.com/about.html

但是,http://localhost:8080/free-riding/www.estadao.com.br/politica/blog-do-fausto-macedo/dia-d-julgamento-bolsonaro-inelegivel-tse-reuniao-embaixadores/会返回"Not Found"。

因此,我应该如何对一个url参数进行编码,以便将其传递给router,并使用fasthttp

以下是代码:

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "os/exec"
  6. "github.com/fasthttp/router"
  7. "github.com/valyala/fasthttp"
  8. )
  9. func Lynx(ctx *fasthttp.RequestCtx) {
  10. var url string = ctx.UserValue("url").(string)
  11. cmd := exec.Command("lynx", "--dump", url)
  12. stdout, err := cmd.Output()
  13. if err != nil {
  14. log.Fatal(err)
  15. return
  16. }
  17. fmt.Fprintf(ctx, "%s\n", stdout)
  18. }
  19. func main() {
  20. r := router.New()
  21. r.GET("/free-riding/{url}", Lynx)
  22. log.Fatal(fasthttp.ListenAndServe(":8080", r.Handler))
  23. }
英文:

The application consists in outputting a bash command to a buffer. The catch: the arguments are urls.

Which is working for simple cases, like: "duckduckgo". I.e., http://localhost:8080/free-riding/duckduckgo works perfectly.

Output:

  1. #[1]DuckDuckGo (HTML)
  2. [2]About DuckDuckGo
  3. ____________________ Submit
  4. References
  5. 1. https://duckduckgo.com/opensearch_html_v2.xml
  6. 2. https://duckduckgo.com/about.html

But, http://localhost:8080/free-riding/www.estadao.com.br/politica/blog-do-fausto-macedo/dia-d-julgamento-bolsonaro-inelegivel-tse-reuniao-embaixadores/ will give:

Not Found.

Thus, how can I encode an url-argument to be passed to a router, using fasthttp?

Here is the code,

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "os/exec"
  6. "github.com/fasthttp/router"
  7. "github.com/valyala/fasthttp"
  8. )
  9. func Lynx(ctx *fasthttp.RequestCtx) {
  10. var url string = ctx.UserValue("url").(string)
  11. cmd := exec.Command("lynx", "--dump", url)
  12. stdout, err := cmd.Output()
  13. if err != nil {
  14. log.Fatal(err)
  15. return
  16. }
  17. fmt.Fprintf(ctx, "%s\n", stdout)
  18. }
  19. func main() {
  20. r := router.New()
  21. r.GET("/free-riding/{url}", Lynx)
  22. log.Fatal(fasthttp.ListenAndServe(":8080", r.Handler))
  23. }

答案1

得分: 2

最终的代码,使用了 @mkopriva 的注释,运行得很好:转义斜杠,或者使用一个捕获所有参数的通配符代替 {url}。

  1. func Lynx(ctx *fasthttp.RequestCtx) {
  2. var urlstring string = ctx.UserValue("url").(string)
  3. urlparsed, err := url.Parse(urlstring)
  4. urlparsedstring := urlparsed.String()
  5. fmt.Fprintf(ctx, "URL: %s\n", urlparsedstring)
  6. cmd := exec.Command("lynx", "--dump", urlparsedstring)
  7. stdout, err := cmd.Output()
  8. if err != nil {
  9. log.Fatal(err)
  10. return
  11. }
  12. fmt.Fprintf(ctx, "%s\n", stdout)
  13. }
  14. func main() {
  15. r := router.New()
  16. r.GET("/free-riding/{url:*}", Lynx)
  17. log.Fatal(fasthttp.ListenAndServe(":8080", r.Handler))
  18. }

显示输出结果:https://imgur.com/a/8f3rpjv

英文:

The final code, which worked just fine, using @mkopriva 's commentary: Escape the slashes, or use a catch-all parameter instead of {url}.

  1. func Lynx(ctx *fasthttp.RequestCtx) {
  2. var urlstring string = ctx.UserValue("url").(string)
  3. urlparsed, err := url.Parse(urlstring)
  4. urlparsedstring := urlparsed.String()
  5. fmt.Fprintf(ctx, "URL: %s\n", urlparsedstring)
  6. cmd := exec.Command("lynx", "--dump", urlparsedstring)
  7. stdout, err := cmd.Output()
  8. if err != nil {
  9. log.Fatal(err)
  10. return
  11. }
  12. fmt.Fprintf(ctx, "%s\n", stdout)
  13. }
  14. func main() {
  15. r := router.New()
  16. r.GET("/free-riding/{url:*}", Lynx)
  17. log.Fatal(fasthttp.ListenAndServe(":8080", r.Handler))
  18. }

Showing the output: https://imgur.com/a/8f3rpjv

答案2

得分: 0

你应该使用URL编码对其进行编码。以下是你的代码中包含URL编码和解码的小改动:

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net/url"
  6. "os/exec"
  7. "github.com/fasthttp/router"
  8. "github.com/valyala/fasthttp"
  9. )
  10. func Lynx(ctx *fasthttp.RequestCtx) {
  11. urlParam := ctx.UserValue("url").(string)
  12. decodedURL, err := url.QueryUnescape(urlParam)
  13. if err != nil {
  14. log.Fatalf("解码URL时出错:%v", err)
  15. return
  16. }
  17. encodedURL := url.QueryEscape(decodedURL)
  18. cmd := exec.Command("lynx", "--dump", encodedURL)
  19. stdout, err := cmd.Output()
  20. if err != nil {
  21. log.Fatalf("执行命令时出错:%v", err)
  22. return
  23. }
  24. fmt.Fprintf(ctx, "%s\n", stdout)
  25. }
  26. func main() {
  27. r := router.New()
  28. r.GET("/free-riding/{url}", Lynx)
  29. log.Fatal(fasthttp.ListenAndServe(":8080", r.Handler))
  30. }

请注意,我已经将代码中的双引号(")替换为了中文引号(“”),以便更好地适应中文环境。

英文:

you should encode it using URL encoding. Here is a small change in your code to include URL encoding and decoding:

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net/url"
  6. "os/exec"
  7. "github.com/fasthttp/router"
  8. "github.com/valyala/fasthttp"
  9. )
  10. func Lynx(ctx *fasthttp.RequestCtx) {
  11. urlParam := ctx.UserValue("url").(string)
  12. decodedURL, err := url.QueryUnescape(urlParam)
  13. if err != nil {
  14. log.Fatalf("Error decoding URL: %v", err)
  15. return
  16. }
  17. cmd := exec.Command("lynx", "--dump", decodedURL)
  18. stdout, err := cmd.Output()
  19. if err != nil {
  20. log.Fatalf("Error executing command: %v", err)
  21. return
  22. }
  23. fmt.Fprintf(ctx, "%s\n", stdout)
  24. }
  25. func main() {
  26. r := router.New()
  27. r.GET("/free-riding/{url}", Lynx)
  28. log.Fatal(fasthttp.ListenAndServe(":8080", r.Handler))
  29. }
  30. </details>

huangapple
  • 本文由 发表于 2023年6月29日 20:30:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/76581079.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定