如何在Golang中构建URL/查询
背景- 我需要根据用户输入构建一个URL/查询,该表单将用于进行API调用 问题- 构建URL时,参数没有正确转义。例如,查询的结尾是一个空格,而不是+ 电流输出- e、 g。 圣塔和阿皮尤岛= 预期产量- e、 g 代码示例- 根URL-如何在Golang中构建URL/查询,go,Go,背景- 我需要根据用户输入构建一个URL/查询,该表单将用于进行API调用 问题- 构建URL时,参数没有正确转义。例如,查询的结尾是一个空格,而不是+ 电流输出- e、 g。 圣塔和阿皮尤岛= 预期产量- e、 g 代码示例- 根URL- var SearchUrl = "https://www.example.org/3/search/movie?query=" 从用户输入获取参数- var MovieSearch []string = r.Form["Get
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?如果MovieSearch包含一个值为bad santa的元素,您看到的看起来是正确的。它将这三个字符串连接起来,并在它们之间加上+。如果单词中有空格,则需要替换它 范例
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(strings.Replace("bad santa", " ", "+", -1))
}
所以你应该这样做
func main() {
a := []string{"bad", "santa"}
fmt.Printf("%q\n", a)
j := ArrayToString(a)
strings.Replace(j, " ", "+",-1)
fmt.Printf("%q\n", j)
}
这里是Go文档的链接-您可以使用转义参数,而不是自己转义参数 此外,您还应使用以下工具来建立您的url:
params := fmt.Sprintf("?query=%s&api_key=######", url.QueryEscape("name"))
perform := url.URL{
Scheme: "https",
Host: "api.example.com",
Path: "3/search/movie",
RawQuery: params,
}
fmt.Println(perform) // <- Calls .String()
通常,应该使用url包的值 这是一个例子,我认为你想要的, 简单的main和http.HandlerFunc格式:
package main
import "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
}
输出:
执行:https://www.example.org/3/search/movie?query=this+是+a+值吗
请注意如何将值放入查询字符串中,并正确转义。我认为您的输入片段可能是错误的,这就是为什么连接没有产生您期望的结果。关于url.queryscape的错误可能是,您在这个函数中有一个名为url的全局变量,或者在粘贴到我们的函数中没有一个变量。基本上,您已经用一个名为url的字符串隐藏了包url。重命名变量url应该可以很好地工作,但是应该这样结束,但是它必须是example.com/value?bad+santar.Form是相同类型的url.Values。。。只需使用r.Form.Getkey,就可以得到一个字符串。基础映射使用map[string][]字符串的唯一原因是表单两次提交相同的表单键是合法的。如果您的html没有这样做,只需像Values一样使用第一个字段。Get没有错误,我更新了我的示例。警告,我没有运行处理程序本身,但它可以编译。这段代码非常简单,编译可能==works我想投票失败的原因有两个。标题与生成URL的问题并不匹配。您的解决方案相当复杂,并且不是以复制粘贴的形式,因此很难在编辑器中找到问题所在。此外,只有问题中的错误与示例中没有的代码相关。若你们把问题归结为一个易于复制、可运行的问题,人们更有可能提供帮助。在play.golang.org上链接到有问题的代码也非常有用。确保问题始终包含代码,没有人会单击链接播放。好的,很酷。谢谢你,伙计。我将来会记住这一点。
package main
import "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
}