golang url 转义

AA := "hello word"
url := " https://www.xxxx.com?aa=" + AA
res,_ := httpGet(url)

这样请求会报错,因为url里有空格,我试了手动将空格转义,但这样麻烦,看了url包,好像都是url解析的方法,golang有没有将url转义的方法?

阅读 19.7k
2 个回答

类似这样子,

package main

import "fmt"
import "net/http"
import "net/url"
import "io/ioutil"

func main() {
    AA := "hello word"
    req := " https://www.baidu.com?query=" + AA
    u,_ := url.Parse(req)
    q := u.Query()
    u.RawQuery = q.Encode() //urlencode
    res,_ := http.Get(u.String())

    result, _ := ioutil.ReadAll(res.Body)   
    res.Body.Close() 

    fmt.Printf("%s", result)
}

感谢@Tranch老师的帮助!

https://github.com/qiukeren/g...

你可以看这里,有一段实例代码,用途是使用map做参数进行请求,对参数和超时也进行了处理,还资瓷了https。


import (
    "crypto/tls"
    "io/ioutil"
    "net/http"
    "net/url"
    "time"
    "strings"
)

//Get is a common http client for httpGet operations and hide UA as GoogleBot.
func Get(urls string) ([]byte, error) {

    req, err := http.NewRequest("GET", urls, nil)

    if err != nil {
        return nil, err
    }
    req.Header.Set("User-Agent", "Googlebot/2.1 (+http://www.google.com/bot.html)")

    client := getClient()
    resp, err := client.Do(req)

    if err != nil {
        return nil, err
    }

    defer resp.Body.Close()
    tempData, err := ioutil.ReadAll(resp.Body)

    if err != nil {
        return nil, err

    }

    return tempData, nil
}

func getClient() *http.Client {
    tr := &http.Transport{
        TLSClientConfig:    &tls.Config{InsecureSkipVerify: true},
        DisableCompression: true,
        DisableKeepAlives:  true,
    }
    client := &http.Client{
        Transport: tr,
        Timeout:   15 * time.Second,
    }
    return client
}

func RequestWithHeader(
    method string,
    url1 string,
    timeout int,
    header map[string]string,
    params map[string]string,
) ([]byte, error) {

    client := getClient()

    paramsA := ""
    if method == "POST" {
        values := url.Values{}
        for k, v := range params {
            values.Add(k, v)
        }
        paramsA = values.Encode()
    }

    req, _ := http.NewRequest(method, url1, strings.NewReader(paramsA))

    for k, v := range header {
        req.Header.Set(k, v)
    }

    if method == "POST" {
        req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    }

    if method == "GET" {
        values := req.URL.Query()
        for k, v := range params {
            values.Add(k, v)
        }
        req.URL.RawQuery = values.Encode()
    }

    getResp, err := client.Do(req)
    if err != nil {
        return nil, err
    }
    defer getResp.Body.Close()
    body, err := ioutil.ReadAll(getResp.Body)
    if err != nil {
        return nil, err
    }
    return body, nil
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题