|
我想向 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("OST",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这样吗。 |
|