在GO中获取具有基本身份验证的http帖子

时间:2017-10-05 19:15:51

标签: http go

我有一个标准的go http请求,我试图在下面的代码中找到正确的。

func IssueSearchQuery(conf Config) (string, error) {

    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
    }

    var client = &http.Client{
        Timeout:   time.Second * 60,
        Transport: tr,
    }
    URL := conf.URL + "/api/search"
    v := url.Values{}
    v.Set("query_expression", "select * from test")
    req, err := http.NewRequest("POST", URL, 
        bytes.NewBufferString(v.Encode()))

    req.SetBasicAuth(conf.User, conf.Password)
    resp, err := client.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    bodyText, err := ioutil.ReadAll(resp.Body)
    s := string(bodyText)
    return s, err
}

在上面的代码中,我连接到服务器,基本身份验证工作,但服务器响应抱怨说缺少所需的query_expression查询参数。如果我curl -u user:pass -d "query_expression=select * from test" --insecure -XPOST 'https://ip:port/api/search',服务器会响应所需的结果。

如果我不使用url.Values {}而代码手动将我的查询编码为URL := conf.URL + "/api/ariel/searches?query_expression=select%20*20from%20test"

等网址,则该代码也可以使用

我无法弄清楚我的查询参数出错了什么。有人可以帮忙吗?谢谢!

1 个答案:

答案 0 :(得分:3)

您似乎正在尝试将POST正文设置为url编码的值。您可以将Content-Type标题设置为application/x-www-form-urlencoded,然后将它们放在正文中(感谢@hobbs),或者在实际网址中使用您的网址编码值而不是正文:< / p>

u, err := url.Parse(conf.URL + "/api/search")
v := url.Values{}
v.Set("query_expression", "select * from test")
u.RawQuery = v.Encode()
req, err := http.NewRequest("POST", u.String(), nil)

通常人们希望POST数据在正文中,所以只添加req.Header.Set("Content-Type", "application/x-www-form-urlencoded")可能是最好的。