如何在 Golang 中构建 URL/查询

背景 -


我需要根据用户输入的表单来构建一个 URL/查询,该表单将用于进行 API 调用。


问题 -


构建 URL 时,参数未正确转义。例如,查询“bad santa”以空格而不是“+”结束。


电流输出 -


例如https://api.example.org/3/search/movie?query=bad santa&api_key=#######


预期输出 -


例如https://api.example.org/3/search/movie?query=bad+santa&api_key=#######


代码示例 -


根网址 -


var SearchUrl = "https://www.example.org/3/search/movie?query="

从用户输入中获取参数 -


var MovieSearch []string = r.Form["GetSearchKey"]  

API 密钥 -


var apiKey = "&api_key=######"

我正在使用ArrayToString()来解析表单输入数据


func ArrayToString(array []string) string{

    str := strings.Join(array, "+")

    return str 

}

然后构建 URL -


var SearchUrl = "https://api.example.org/3/search/movie?query="

var MovieSearch []string = r.Form["GetSearchKey"]  

var apiKey = "&api_key=########"

UrlBuild := []string {SearchUrl, ArrayToString(MovieSearch), apiKey}

OUTPUT_STRING := ArrayToString(UrlBuild)

问题 -


如何使用正确转义的用户输入 GET 参数构建 URL?


守着一只汪
浏览 199回答 3
3回答

www说

通常,应该使用 url 包的值。下面是一个例子,那做什么,我想你想,玩 了简单为主,并在http.HandlerFunc形式:package mainimport "fmt"import "net/url"import "net/http"func main() {    baseURL := "https://www.example.org/3/search/movie"    v := url.Values{}    v.Set("query", "this is a value")    perform := baseURL + "?" + v.Encode()    fmt.Println("Perform:", perform)}func formHandler(w http.ResponseWriter, r *http.Request) {    baseURL := "https://www.example.org/3/search/movie"    v := url.Values{}    v.Set("query", r.Form.Get("GetSearchKey")) // take GetSearchKey from submitted form    v.Set("api_ley", "YOURKEY") // whatever your api key is    perform := baseURL + "?" + v.Encode() // put it all together    fmt.Println("Perform:", perform) // do something with it}输出: Perform: https://www.example.org/3/search/movie?query=this+is+a+value请注意如何将值放入查询字符串中,并为您正确转义。

慕少森

您可以使用https://golang.org/pkg/net/url/#QueryEscape转义参数,而不是自己做。此外,您应该使用https://golang.org/pkg/net/url/#URL来建立您的网址:params := fmt.Sprintf("?query=%s&api_key=######", url.QueryEscape("name"))perform := url.URL{&nbsp; &nbsp; Scheme:&nbsp; &nbsp; &nbsp;"https",&nbsp;&nbsp;&nbsp; &nbsp; Host:&nbsp; &nbsp; &nbsp; &nbsp;"api.example.com",&nbsp; &nbsp; Path:&nbsp; &nbsp; &nbsp; &nbsp;"3/search/movie",&nbsp; &nbsp; RawQuery:&nbsp; &nbsp;params,}fmt.Println(perform) // <- Calls .String()我建议检查https://golang.org/doc/effective_go.html。如果您的数据以 [] 字符串形式出现:func ArrayToQuery(values []string) string {&nbsp; &nbsp; return url.QueryEscape(strings.Join(values, " "))}

潇潇雨雨

如果单词中有空格,则需要替换它。例子package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "strings")func main() {&nbsp; &nbsp; fmt.Println(strings.Replace("bad santa", " ", "+", -1))}所以你应该这样做func main() {&nbsp; &nbsp; a := []string{"bad", "santa"}&nbsp; &nbsp; fmt.Printf("%q\n", a)&nbsp; &nbsp; j := ArrayToString(a)&nbsp; &nbsp; strings.Replace(j, " ", "+",-1)&nbsp; &nbsp; fmt.Printf("%q\n", j)}这是 Go 文档的链接 - https://golang.org/pkg/strings/#Replace
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go