我正在使用https://github.com/emicklei/go-restful在Go中编写REST API
在我的JSON输出中,我想输出到其他REST资源的绝对路径,但我不知道如何才能获得构建路径的所有相关部分,例如传输(http/https)、主机、端口、根路径。
我需要自己跟踪它吗?我是不是以某种方式从Request中获取它?
发布于 2016-08-30 08:32:24
在尝试了一段时间后,我最终尝试了这两种方法。事实证明,至少部分信息可以从Request中提取(注意:我假设如果路由是用绝对url定义的,那么所有这些信息都可以从Request.URL中获取)
package main
import (
"github.com/emicklei/go-restful"
"io"
"net/http"
)
func main() {
ws := new(restful.WebService)
ws.Route(ws.GET("/hello").To(hello))
restful.Add(ws)
http.ListenAndServe(":8080", nil)
}
func hello(req *restful.Request, resp *restful.Response) {
io.WriteString(resp, "Protocol: " + req.Request.Proto + "\nHost: " + req.Request.Host + "\nPath: " + req.Request.URL.Path)
}上面的代码会将以下内容打印到浏览器。我想人们可以使用它来构造urls来进行jsonify,尽管在没有一些关于基本路径或特定路径的先验知识或一些区分这两个路径的语法约定的情况下,还不清楚如何解析出基本路径。
Protocol: HTTP/1.1
Host: localhost:8080
Path: /hello我尝试的第二件事是在包级别定义一个URL,并使用它来构建一个自定义解析函数。url.URL维护URL的结构表示;可以使用URL.parse(string)解析相对(或绝对)路径并将其与现有的URL合并。方便的是,URL可以通过它的String()方法输出自身的字符串表示。
自定义解析函数只保留包级URL的副本,每次使用某个特定路径调用它时,它都会将新路径粘贴到URL.Path的末尾,并返回一个除了新的连接路径之外与之相同的新URL (因为当我们为它提供一个相对路径时,URL.parse()就是这样做的)。然后,可以在新的URL上调用URL.String(),将URL字符串化成我们想要编组的字符串。
package main
import (
"github.com/emicklei/go-restful"
"io"
"net/http"
"net/url"
"fmt"
"encoding/json"
)
var myurl = url.URL{
Scheme:"http",
Host: "localhost:8080",
Path:"basepath",
}
var parse = getParseFn(myurl)
func main() {
ws := new(restful.WebService)
ws.Route(ws.GET("/jsonUrls").To(jsonUrls))
restful.Add(ws)
http.ListenAndServe(":8080", nil)
}
func jsonUrls(req *restful.Request, resp *restful.Response) {
urls := []string{}
for _, s := range []string{"get", "put", "whatever"} {
u, err := parse(s)
if err != nil {
fmt.Println(err)
}
urls = append(urls, u.String())
}
json_urls, err := json.Marshal(urls)
if err != nil {
fmt.Println(err)
}
io.WriteString(resp, string(json_urls))
}
func getParseFn (myUrl url.URL) func (string) (*url.URL, error) {
parse := func (s string) (*url.URL, error) {
u, err := myUrl.Parse(myUrl.Path + "/" + s)
return u, err
}
return parse
} 这将在浏览器中打印以下内容:
["http://localhost:8080/basepath/get","http://localhost:8080/basepath/put","http://localhost:8080/basepath/whatever"]https://stackoverflow.com/questions/39216053
复制相似问题