对API的Golang POST请求返回400,而与e的请求相同。 G。邮差返回200
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对API的Golang POST请求返回400,而与e的请求相同。 G。邮差返回200相关的知识,希望对你有一定的参考价值。
在我的Go应用程序中,我使用Web API,它接受POST请求并在成功时返回令牌。
URL如下:“https://accounts.zoho.com/apiauthtoken/nb/create?SCOPE=xxxx&EMAIL_ID=xxxx&PASSWORD=xxxx”
如果我在Postman或任何其他工具中发送此信息,我会获得具有预期正文的状态代码200,但在我的go代码中,相同的请求返回错误代码400。
url := "https://accounts.zoho.com/apiauthtoken/nb/create?SCOPE=xxxx&EMAIL_ID=xxxx&PASSWORD=xxxx"
req, err := http.NewRequest("POST", url, nil)
log.Println(err)
res, err := client.Do(req)
log.Println(err)
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
log.Println(err)
fmt.Println(res)
fmt.Println(string(body))
所有错误都是零,但res结构包含400 Bad Request,最后一个输出(正文)是空的。
输出:
&{400 Bad Request 400 HTTP/1.1 1 1 map[Date:[Sat, 03 Mar 2018 16:48:35 GMT] Connection:[keep-alive] Set-Cookie:[a8c61fa0dc=5f224f2ab9d067cfce10fd0b7fae48bf; Path=/; Secure; HttpOnly] Server:[ZGS]] 0xc04225a080 -1 [chunked] false false map[] 0xc042034a00 0xc0421bc370}
我很感激任何帮助,因为我不知道这个问题来自哪里。
答案
url编码的参数应该在body参数中提供,而不是作为查询字符串。所以这也是一个问题。设置你的参数在体内实施io.Reader
。
func NewRequest(method, url string, body io.Reader) (*Request, error)
在使用Client.Do
发送请求之前,请在请求中设置标题Content-Type。
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
由于邮递员足够聪明,可以为您设置标题。这就是为什么没有错误。整个代码变成了
package main
import (
"log"
"net/http"
"net/url"
"io/ioutil"
"strings"
)
func main(){
url := "https://accounts.zoho.com/apiauthtoken/nb/create"
var data url.Values{}
data.Set("SCOPE","xxxx")
data.Add("EMAIL","xxxx")
data.Add("PASSWORD","xxxx")
req, err := http.NewRequest("POST", url, strings.NewReader(data.Encode()))
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
log.Println(err)
res, err := client.Do(req)
log.Println(err)
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
log.Println(err)
fmt.Println(res)
fmt.Println(string(body))
}
以上是关于对API的Golang POST请求返回400,而与e的请求相同。 G。邮差返回200的主要内容,如果未能解决你的问题,请参考以下文章
发生错误 400(错误请求)时,使用 Axios 从 POST 捕获返回 json