回答

收藏

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

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

我想向 API 发出 POST 请求,以我的数据为数据application/x-www-form-urlencoded发送内容类型。因为我需要管理标头,所以我使用它http.NewRequest(method,urlStr string,body io.Reader)方法创建请求。POST 请求,我将我的数据查询附加到 URL 并将文本留空,如下所示:, N  v  R) t. O
    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)}  W$ X6 m$ q; t& h5 `
当我回应时,我总是得到400 BAD REQUEST. 我相信问题取决于我的要求, API 不知道我发布的有效负载。我知道 这样的方法Request.ParseForm,但我不确定如何在这种情况下使用它。也许我错过了一些进一步的标题,也许有更好的方法application/json使用body以有效负载为类型发送参数?
9 E& q! s3 R& y; H3 D! g+ m                                                                ; O" ^# P2 R0 N
    解决方案:                                                               
* n. R: u) y8 V5 [& u9 F1 b: {                                                                必须body在http.NewRequest(method,urlStr string,body io.Reader) 提供方法参数URL 作为实现编码的有效负载io.Reader接口类型。+ e: l4 G6 f9 D' u
基于示例代码:
- ~/ m7 V5 E" p' b! qpackage main6 m) ~& r# Z9 z6 }
import (
+ \4 I; o0 N0 \9 x' K( i  L  B% u# x                “fmt”6 i7 ?: ^1 R8 F! Q- a
                “net/http”/ w; _& K: i% a" ?+ ~
                “net/url”
: U. Q1 c) q6 Z4 M: H) \! _- I                “strconv”
  p# S$ C$ A: o4 f9 d; _                “strings”
" J0 H  ?; J1 w6 H)/ `; T  U- r0 D) }6 P0 V0 m
func main() {
1 h# c  _9 c4 w                apiUrl := "https://api.com“
) ^6 N/ J" `3 f# d* X                resource := “/user/”9 q& Z9 L6 e/ w4 b7 \2 h
                data := url.Values{}, W- Y2 m5 T7 `$ ~6 h9 \. ]$ e
                data.Set(“name”,“foo”)2 z2 T, }  {8 G7 ~; k3 d3 Q
                data.Set(“surname”,“bar”)
3 q$ _" O1 `6 O. }& s3 e+ x/ Nu,_ := 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)}
+ B1 R0 I) }1 b) [3 j' R2 Z. Oresp.Status是200 OK这样吗。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则