如何在Golang中构建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

背景-

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

问题-

构建URL时,参数没有正确转义。例如,查询的结尾是一个空格,而不是+

电流输出-

e、 g。 圣塔和阿皮尤岛=

预期产量-

e、 g

代码示例-

根URL-

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
}