如何在 Go 中使用 application/x-www-form 执行 GET 请求?

基本上,我需要在 Go 中实现以下方法 - https://api.slack.com/methods/users.lookupByEmail。


我试着这样做:


import (

    "bytes"

    "encoding/json"

    "errors"

    "io/ioutil"

    "net/http"

)


type Payload struct {

    Email string `json:"email,omitempty"` 

}


// assume the following code is inside some function


client := &http.Client{}

payload := Payload{

    Email: "octocat@github.com",

}


body, err := json.Marshal(payload)

if err != nil {

    return "", err

}


req, err := http.NewRequest("GET", "https://slack.com/api/users.lookupByEmail", bytes.NewReader(body))

if err != nil {

    return "", err

}


req.Header.Add("Authorization", "Bearer "+token)

req.Header.Add("Content-Type", "application/x-www-form-urlencoded")


resp, err := client.Do(req)

if err != nil {

    return "", err

}


defer resp.Body.Close()

if resp.StatusCode != 200 {

    t, _ := ioutil.ReadAll(resp.Body)

    return "", errors.New(string(t))

}


responseData, err := ioutil.ReadAll(resp.Body)

if err != nil {

    return "", err

}


return string(responseData), nil

但是我收到一个错误,即“电子邮件”字段丢失,这很明显,因为此内容类型不支持 JSON 有效负载: {"ok":false,"error":"invalid_arguments","response_metadata":{"messages":["[ERROR] missing required field: email"]}} (type: string)


我找不到如何在 GET 请求中包含发布表单 - http.NewRequest 和 http.Client.Get 都没有可用的发布表单参数;http.Client.PostForm 发出 POST 请求,但在这种情况下需要 GET。另外,我认为我必须在这里使用 http.NewRequest (除非存在另一种方法),因为我需要设置 Authorization 标头。


凤凰求蛊
浏览 166回答 1
1回答

翻过高山走不出你

你误解了application/x-www-form-urlencoded标题,你应该在这里传递一个 URL 参数。看一个例子:import (  ...  "net/url"  ...)data := url.Values{}data.Set("email", "foo@bar.com")data.Set("token", "SOME_TOKEN_GOES_HERE")r, _ := http.NewRequest("GET", "https://slack.com/api/users.lookupByEmail", strings.NewReader(data.Encode()))r.Header.Add("Content-Type", "application/x-www-form-urlencoded")r.Header.Add("Content-Length", strconv.Itoa(len(data.Encode())))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go