回答

收藏

使用 `http.NewRequest(...)` 发出 URL 编码的 POST 请求

技术问答 技术问答 291 人阅读 | 0 人回复 | 2023-09-12

我想向 API 发出 POST 请求,以我的数据为数据application/x-www-form-urlencoded发送内容类型。因为我需要管理标头,所以我使用它http.NewRequest(method,urlStr string,body io.Reader)方法创建请求。POST 请求,我将我的数据查询附加到 URL 并将文本留空,如下所示:/ `( ~9 g, m9 C: K
    package mainimport  "bytes"    "fmt"    "net/http"    "net/url"    "strconv")func main()      apiUrl := "https://api.com"    resource := "/user/"    data := url.Values{}    data.Set("name","foo")    data.Add("surname","bar")    u,_ := url.ParseRequestURI(apiUrl)    u.Path = resource    u.RawQuery = data.Encode()    urlStr := fmt.Sprintf("%v",u) // "https://api.com/user/?name=foo&surname=bar"    client := &http.Client{}    r,_ := http.NewRequest(&quotOST",urlStr,nil)    r.Header.Add("Authorization","auth_token="XXXXXXX"")    r.Header.Add("Content-Type","application/x-www-form-urlencoded")    r.Header.Add("Content-Length",strconv.Itoa(len(data.Encode())))    resp,_ := client.Do(r)    fmt.Println(resp.Status)}
    5 Y- w. Q9 l+ H4 r
当我回应时,我总是得到400 BAD REQUEST. 我相信问题取决于我的要求, API 不知道我发布的有效负载。我知道 这样的方法Request.ParseForm,但我不确定如何在这种情况下使用它。也许我错过了一些进一步的标题,也许有更好的方法application/json使用body以有效负载为类型发送参数?
- Z5 O- \. A  F7 H) H2 J; {, F                                                                $ O# o' {5 ]) ~
    解决方案:                                                               
* U/ u, `) M* c                                                                必须body在http.NewRequest(method,urlStr string,body io.Reader) 提供方法参数URL 作为实现编码的有效负载io.Reader接口类型。- W8 y- g2 k0 L6 D0 o+ j! \
基于示例代码:1 m! f/ K3 V, s; q) S& k
package main
$ c0 I- |  I9 M- jimport (8 u: ]( A; f" o$ C# ]
                “fmt”4 T0 r* B; k% @3 P& z& G2 {
                “net/http”# t! J8 ?0 I( L
                “net/url”! M2 v+ J+ F5 U6 ?" D
                “strconv”
9 t  _0 R4 T& G! \% Q0 @                “strings”
* }% p" E5 t. ?! }8 A4 A. k)
2 \+ Y; U2 H7 x2 G* rfunc main() {+ f( i1 s7 @, G
                apiUrl := "https://api.com“. {; S8 T0 \5 |, H0 ~8 v7 X  h
                resource := “/user/”  k* h* v; q4 u* @/ l
                data := url.Values{}
" U6 |. B- w0 J8 z; b                data.Set(“name”,“foo”)0 Q1 \7 S5 U  G
                data.Set(“surname”,“bar”)
5 J6 Z% e! ?/ k& wu,_ := url.ParseRequestURI(apiUrl)u.Path = resourceurlStr := u.String() // "https://api.com/user/"client := &http.Client{}r,_ := http.NewRequest(http.MethodPost,urlStr,strings.NewReader(data.Encode()) // URL-encoded payloadr.Header.Add("Authorization","auth_token=\"XXXXXXX\"")r.Header.Add("Content-Type","application/x-www-form-urlencoded")r.Header.Add("Content-Length",strconv.Itoa(len(data.Encode())))resp,_ := client.Do(r)fmt.Println(resp.Status)}8 {! P  y$ o. j2 b1 E; F- n6 u/ o
resp.Status是200 OK这样吗。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则