对API的Golang POST请求返回400,而对e。G邮递员返回200

对API的Golang POST请求返回400,而对e。G邮递员返回200,api,post,go,request,Api,Post,Go,Request,在我的Go应用程序中,我使用一个Web API,它接受POST请求并在成功时返回一个令牌 URL如下所示:“ 如果我在邮递员或任何其他工具中发送此消息,我将获得预期正文的状态代码200,但在我的go代码中,相同的请求返回错误代码400 url := "https://accounts.zoho.com/apiauthtoken/nb/create?SCOPE=xxxx&EMAIL_ID=xxxx&PASSWORD=xxxx" req, err := http.NewReques

在我的Go应用程序中,我使用一个Web API,它接受POST请求并在成功时返回一个令牌

URL如下所示:“

如果我在邮递员或任何其他工具中发送此消息,我将获得预期正文的状态代码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个错误请求,并且(正文的)最后一个输出为空

输出:
我非常感谢您的帮助,因为我不知道这个问题是从哪里来的。

Url编码的参数应该在body参数中提供,而不是作为查询字符串提供。所以这也可能是个问题。在body实现
io.Reader
中设置参数

func NewRequest(method, url string, body io.Reader) (*Request, error)
使用
Client.Do
发送请求之前,请在请求中设置标题内容类型

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))

}

我也面临着类似的问题。
401
的原因仅表示授权令牌无效。后来我注意到Postman执行每次更新头的
请求前脚本。您可以在golang中使用相同的预请求脚本代码,并且可以正常工作

我在使用微服务时也遇到过同样的问题。你能打印错误的输出吗?当使用go run in terminalI运行你的程序时,你应该在控制台上得到错误的输出。我更新了我的问题并添加了输出,但正如我所说的,错误为零,响应“object”包含400。我以前已经尝试过设置内容类型,但我不知道你需要额外传递url值。谢谢你
url.Values{}
实际上是一个类型
map[string][/string
,这是一个创建的字符串。你知道为什么API仍然没有用你的方法发送或接收参数吗?API发送的消息与您完全不提供参数时发送的消息完全相同。如果任何参数损坏,它将返回一个特定的错误消息,因此情况并非如此。您是否会显示正在获取的错误消息?您是否能够获取发布的参数?这是我从API获得的结果(我希望它的结果设置为TRUE,而不是CAUSE返回一个令牌:
##Tue Mar 06 12:20:41 PST 2018 CAUSE=null RESULT=FALSE
我不知道您所说的“获取发布的参数”是什么意思。
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))

}