我想向API发送POST请求,以将我的数据作为application/x-www-form- urlencoded
内容类型发送。由于我需要管理请求标头,因此我正在使用该http.NewRequest(method, urlStr string, body io.Reader)
方法来创建请求。对于此POST请求,我将数据查询附加到URL上,并将正文保留为空,如下所示:
package main
import (
"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("POST", 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)
}
当我回应时,我总是得到400 BAD REQUEST
。我相信问题取决于我的请求,API无法理解我要发布的有效负载。我知道类似的方法Request.ParseForm
,但不确定在这种情况下如何使用它。也许我缺少一些其他的Header,也许有更好的方法application/json
使用body
参数将有效载荷作为类型发送吗?
必须body
在http.NewRequest(method, urlStr string, body io.Reader)
方法的参数上提供URL编码的有效负载,作为实现io.Reader
接口的类型。
根据示例代码:
package main
import (
"fmt"
"net/http"
"net/url"
"strconv"
"strings"
)
func main() {
apiUrl := "https://api.com"
resource := "/user/"
data := url.Values{}
data.Set("name", "foo")
data.Set("surname", "bar")
u, _ := url.ParseRequestURI(apiUrl)
u.Path = resource
urlStr := u.String() // "https://api.com/user/"
client := &http.Client{}
r, _ := http.NewRequest("POST", urlStr, strings.NewReader(data.Encode())) // URL-encoded payload
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)
}
resp.Status
是200 OK
这种方式。
问题内容: 我正在尝试使用将数据从一个golang服务传递到另一服务。为此,我使用了以下代码: 当我尝试转储从用户服务收到的数据时: 我空了 在这里,我只是尝试将跟踪范围插入到我的请求中,以前我曾经使用过传递数据,它可以完美工作。但是我不知道该怎么做 问题答案: 从ParseForm的文档中: […]当Content-Type不是application / x-www-form- urlencod
我是Spring的新手,正在尝试用RestTemplate执行rest请求。Java代码应该执行与下面curl命令相同的操作: 但服务器拒绝了带有的RestTemplate
我阅读了一些将jsons发布到服务器的示例。 有人说: OkHttp是Java提供的HttpUrlConnection接口的实现。它提供了一个用于写入内容的输入流,而不知道(或关心)该内容是什么格式。 现在我想用name和password参数对URL做一个普通的post。 这意味着我需要自己将名称和值对编码成流?
我试图使用带有模块的PasteBin API创建一个新的粘贴,如下所示: 我的理解是,由于方法是并且提供了querystring参数,对象中的值将作为对存储在正文中。(参考:如何在HTTP POST请求中发送参数?) 当发出请求并提供时,参数究竟是如何发送的? 如何仅使用模块发送URL编码的正文?
问题内容: 我正在尝试发出POST请求以检索有关一本书的信息。这是返回HTTP代码的代码:302,已移动 当我从浏览器尝试时,可以从以下页面进行操作:http : //www.bkstr.com/webapp/wcs/stores/servlet/BuybackMaterialsView?langId=-1&catalogId=10001&storeId=10051&schoolStoreId=1
问题内容: 如果尝试登录https://orbit.theplanet.com/Login.aspx?url=/Default.aspx(使用任何用户名/密码组合),则可以看到登录凭据以非传统集的形式发送POST数据:仅一个寂寞的JSON字符串,没有正常的key = value对。 具体来说,代替: 甚至类似: 简单来说就是: 是否可以使用或替代模块执行此类请求?我愿意这样做,但希望有更高层次的东