”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么我在发送 URL 编码的 POST 请求时收到 400 BAD REQUEST?

为什么我在发送 URL 编码的 POST 请求时收到 400 BAD REQUEST?

发布于2024-12-22
浏览:581

Why am I getting a 400 BAD REQUEST when sending URL-encoded POST requests?

带有 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 编码的有效负载被提供给实现 io.Reader 的 strings.NewReader 函数。然后正确构建并发送请求。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3