我正在使用网址的前面构建一个网址
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
}
然后像这样建立网址,
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)
带有一个单词的URL输出完美无缺。 URL看起来像这样,
https://api.example.org/3/search/movie?query=+bad+&api_key=#####
当我在输入字段中添加第二个单词时,url看起来像这样,
https://api.example.org/3/search/movie?query=bad santa&api_key=e######
我需要关键字在它们之间没有空格,就像在无效的网址中一样。
根据Cedmundo的回答,这是我目前的尝试
func ArrayToQuery(values []string) string {
return url.QueryEscape(strings.Join(values, " "))
}
func searchHandler(w http.ResponseWriter, r *http.Request) {
display(w, "search", &Page{Title: "Search"})
fmt.Println("method:", r.Method)
r.ParseForm()
var MovieSearch = r.Form["GetSearchKey"]
var SearchKeys = ArrayToQuery(MovieSearch)
params := fmt.Sprintf("?query=%s&api_key=eagaggagagagagagag", url.QueryEscape(SearchKeys))
perform := url.URL{
Scheme: "https",
Host: "api.example.org",
Path: "3/search/movie",
RawQuery: params,
}
fmt.Println(perform) // <- Calls .String()
}
错误
./main.go:63: url.QueryEscape undefined (type string has no field or method QueryEscape)
./main.go:75: url.QueryEscape undefined (type string has no field or method QueryEscape)
./main.go:76: url.URL undefined (type string has no field or method URL)
./main.go:94: undefined: OUTPUT_STRING
./main.go:96: undefined: OUTPUT_STRING
答案 0 :(得分:2)
通常,应该使用url package的值。
以下是一个例子,我想你想做的事,on play 两者都是一个简单的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
}
输出:
Perform: https://www.example.org/3/search/movie?query=this+is+a+value
注意如何将值放入查询字符串中,并为您正确转义。
答案 1 :(得分:1)
您可以使用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{
Scheme: "https",
Host: "api.example.com",
Path: "3/search/movie",
RawQuery: params,
}
fmt.Println(perform) // <- Calls .String()
我建议您查看https://golang.org/doc/effective_go.html。
如果您的数据来自[] string:
func ArrayToQuery(values []string) string {
return url.QueryEscape(strings.Join(values, " "))
}
答案 2 :(得分:0)
如果MovieSearch
包含一个值为“bad santa”的元素,那么您所看到的内容看起来是正确的。它正在加入这三个字符串并在它们之间添加“+”。
答案 3 :(得分:0)
如果单词中有空格,则需要替换它。
实施例
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文档的链接 - https://golang.org/pkg/strings/#Replace