2016-03-14 64 views
-7

我建立與URL,使用隔板在Strings.join GoLang

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

然後形成持有的關鍵字來搜索數據的前一個URL。

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) 

帶一個單詞的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 
+1

我認爲你的輸入切片可能是錯誤的,這就是爲什麼連接沒有產生你所期望的。 – Tyler

+0

關於url.QueryEscape的錯誤很可能是因爲你有一個名爲「url」的全局變量(或者這個函數中的一個var,但不是你粘貼給我們的東西)。基本上,你用一個名爲url的字符串來映射包URL。重命名變量URL,它應該正常工作 –

回答

1

通常情況下,應該使用URL封裝的價值觀。

下面是一個例子,那做什麼,我想你想,on play 了簡單爲主,並在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

注意的值是如何放入查詢字符串,妥善轉義,爲您。

+0

r.Form是同一類型(url.Values) ...只需使用r.Form.Get(「key」),你就可以得到一個字符串。基礎地圖使用map [string] []字符串的唯一原因是因爲表單提交相同的表單鍵兩次是合法的。如果你的html不這樣做,只需使用第一個字段就像Values.Get(https://golang.org/src/net/url/url.go?s=19773:19811#L698) –

+0

那麼你的說如果我使用r.Form.Get我不必通過ArraytoString()無效操作運行表單數據:r.Form.Get [「GetSearchKey」](類型func(字符串)字符串不支持索引 – wuno

+0

正確,我更新了我的例子,警告,我沒有運行處理程序本身,但它編譯,並且代碼很簡單,編譯可能==工作 –

0

如果MovieSearch包含一個元素,其值爲「聖誕壞公公」,你看到的長相正確。它將加入這三個字符串並在它們之間加上「+」。

+0

但應該是結束了這個樣子,\t \t \t 但它需要example.com/value?bad+santa – wuno

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) 
} 

這裏是轉到文檔的鏈接 - 而不是https://golang.org/pkg/strings/#Replace

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

如果你的數據進入[]字符串:

func ArrayToQuery(values []string) string { 
    return url.QueryEscape(strings.Join(values, " ")) 
}