Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在GoRESTful中获取完整的主机和url_Rest_Http_Url_Go_Go Restful - Fatal编程技术网

如何在GoRESTful中获取完整的主机和url

如何在GoRESTful中获取完整的主机和url,rest,http,url,go,go-restful,Rest,Http,Url,Go,Go Restful,我正在使用Go编写RESTAPI 在JSON输出中,我希望输出到其他REST资源的绝对路径,但我不知道如何获得构建路径的所有相关部分,例如传输(http/https)、主机、端口、根路径 我是否需要自己跟踪它,我是否从请求中以某种方式获取它?在玩了一段时间后,我最终尝试了两种方法。事实证明,至少可以从请求中提取一些信息(注意:我假设如果路由是用绝对url定义的,那么所有这些信息都可以从请求.url) 以上内容将以下内容打印到浏览器中。我认为可以使用它来构造URL来jsonify,尽管在没有基本路

我正在使用Go编写RESTAPI

在JSON输出中,我希望输出到其他REST资源的绝对路径,但我不知道如何获得构建路径的所有相关部分,例如传输(http/https)、主机、端口、根路径


我是否需要自己跟踪它,我是否从
请求中以某种方式获取它?

在玩了一段时间后,我最终尝试了两种方法。事实证明,至少可以从
请求
中提取一些信息(注意:我假设如果路由是用绝对url定义的,那么所有这些信息都可以从
请求.url

以上内容将以下内容打印到浏览器中。我认为可以使用它来构造URL来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调用code>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"]
["http://localhost:8080/basepath/get","http://localhost:8080/basepath/put","http://localhost:8080/basepath/whatever"]