api - Golang 向 API 的 POST 请求返回 400,而与 e. G。 postman 退回200

标签 api post go request

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

网址如下:“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 编码的参数应该在正文参数中提供,而不是作为查询字符串。所以这也可能是个问题。在实现 io.Reader 的主体中设置参数。

func NewRequest(method, url string, body io.Reader) (*Request, error)

在使用 Client.Do 发送请求之前,在您的请求中设置 header Content-Type。

req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

因为 postman 足够聪明,可以为您设置标题。这就是为什么没有错误。 整个代码变为

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 向 API 的 POST 请求返回 400,而与 e. G。 postman 退回200,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49086499/

相关文章:

java - SCM 管理器 REST POST xml 返回 415 不支持的媒体类型

API key 内容加密

php - PHP curl 的 SSL 错误

python - 请求 - POST 分页?

javascript - REST:调用 javascript 函数将操作发送到 API

string - 字符串: because so many different start characters,的词库需要用不等于逻辑拆分

ios - 使用 AFNetworking 2 发布嵌套的 NSDictionary

javascript - 将 ByteArray 从 Knockout.js 发布到 Web 服务

linux - 您可以在 Go 中运行程序的独立实例吗?

go - $GOPATH 不能设置为 $GOROOT,为什么不呢?