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