【问题标题】:How to call/open a URL within Go method?如何在 Go 方法中调用/打开 URL?
【发布时间】:2015-10-27 04:03:57
【问题描述】:

我在 Go 中设置了 Gorilla Mux 路由器。我在该路由器中设置了路由,以及与这些路由关联的函数处理程序。路由器完美运行,如果您打开浏览器窗口并输入特定 URL。但是,我遇到的问题是如果在命令行中输入 URL 该怎么办。我知道如何从命令行参数存储 URL,但我不知道如何将存储为 Go 中的 URL 变量的 URL 转发到路由器。比如,如果 URL 是在命令行中给出的而不是通过浏览器窗口输入的,你如何调用路由的函数处理程序?

代码:

u, err := url.Parse(os.Args[1])
if err != nil {
    fmt.Println(err.Error())
}

host, port, _ := net.SplitHostPort(u.Host)

s := []string{":", port};

router := ANewRouter()

log.Fatal(http.ListenAndServe(strings.Join(s, ""), router))

//Route URL to router, somehow

【问题讨论】:

  • 您是在问如何使用curl 之类的东西从命令行发出请求吗?
  • @JimB 不,绝对不是。这个问题问起来很容易让人困惑。更像是,在命令行上给出了 url,比如“go run *.go -url="localhost:8080/something",其中 go 应用程序解析 URL 的 URL 标志
  • 发布您拥有的代码会有所帮助
  • 当您在命令行中输入 URL 时,您遇到了什么问题?程序会抛出错误吗?发布会有所帮助。
  • 您是否尝试从用户输入的 url 提供服务?因为这就是你的代码正在做的事情。如果您尝试向它提出请求,我的回答应该可以满足您的要求。

标签: go url-routing gorilla mux


【解决方案1】:

如果您尝试在 Go 中发出 HTTP 请求,那么在标准库中可以轻松使用用于该目的的方法; https://golang.org/pkg/net/http/

正如 JimB 在评论中指出的那样,您可以使用 curl 之类的东西,而完全放弃使用 Go。当您可以执行 resp, err := http.Get(urlArg) 并获得相同的结果时,从 Go 启动 curl 对我来说没有多大意义。还有其他 HTTP 动词的方法,如果您需要对请求进行更精细的控制,您可以使用 Do 方法并创建 Request 对象来执行诸如设置标头之类的操作。

【讨论】:

  • 那行不通。我做到了: http.Get("localhost:8080/list") 什么也没发生。我在浏览器中输入了“localhost:8080/list”,它调用了 API
  • @AbhishekSaha 确保在 Go 中使用 http://localhost:8080/list 来处理您的请求。然后检查errresp 的值。如果 err 不是 nil 你得到了 200 并且可以继续阅读响应正文。尝试将其打印到控制台以进行调试。我保证如果你使用得当,这个方法会做你想做的事。
  • 如果我在启动路由器后尝试 http.Get 调用,它不会被调用。如果我在启动路由器之前尝试 http.Get 调用,我会收到此错误:“getsockopt:连接被拒绝”。我这样启动路由器:"log.Fatal(http.ListenAndServe(":8080", router))"
  • @AbhishekSaha 此代码不应在您的 API 中...它们应该是两个不同的应用程序。启动您的 API,编写此代码作为它自己的小独立主代码,然后从命令行运行它。您的 API 基于用户从命令行传入的参数调用自身毫无意义......
  • 成功了,谢谢你的帮助。相信我,如果我不需要,我不会使用 Go
猜你喜欢
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 2017-07-26
  • 2015-09-30
  • 2022-11-16
  • 1970-01-01
相关资源
最近更新 更多