带有 URL 编码负载的 POST 请求
使用 URL 编码数据构建 POST 请求时,经常会遇到 400 BAD REQUEST 响应,表明服务器无法理解负载。当有效负载提供不正确时,通常会出现此问题。
标准库的 http.NewRequest(...) 方法期望将有效负载作为第三个参数提供,该参数应实现 io.Reader 接口。对于 URL 编码的有效负载,这意味着它应该是一串编码的键值对。
示例代码:
正确发送 URL 编码使用 http.NewRequest(...) 将数据作为 POST 请求,请考虑以下示例:
package main import ( "fmt" "io/ioutil" "net/http" "net/url" "strings" ) func main() { apiUrl := "https://api.com" resource := "/user/" data := url.Values{} data.Set("name", "foo") data.Add("surname", "bar") u, _ := url.ParseRequestURI(apiUrl + resource) client := &http.Client{} r, _ := http.NewRequest(http.MethodPost, u.String(), strings.NewReader(data.Encode())) r.Header.Add("Authorization", "auth_token=\"XXXXXXX\"") r.Header.Add("Content-Type", "application/x-www-form-urlencoded") resp, _ := client.Do(r) fmt.Println(resp.Status) bodyBytes, _ := ioutil.ReadAll(resp.Body) fmt.Println(string(bodyBytes)) }
在此示例中, URL 编码的有效负载提供给 strings.NewReader 函数,该函数实现 io.Reader。然后正确构建并发送请求。
以上是为什么我在发送 URL 编码的 POST 请求时收到 400 BAD REQUEST?的详细内容。更多信息请关注PHP中文网其他相关文章!