403进行Golang POST时禁止使用

时间:2017-03-07 17:29:58

标签: go http-status-code-403

我有一个Java Spring Boot应用程序提供的REST端点,我试图通过简单的Go(go1.8 darwin / amd64)程序来实现。我曾尝试过两种不同的方式:

const (
    LOCAL_BASE         = "http://localhost:11400"
    ADD_FUNDS_ENDPOINT = "/sub-accounts/%d/add-funds"
)

type InputArgumentsJson struct {
    Amount           float64 `json:"amount"`
    BufferAmount     float64 `json:"bufferAmount"`
    FromSubAccountID int     `json:"fromSubAccountId"`
}

...

// set up json body
inputArguments := &InputArgumentsJson{Amount: 1100, BufferAmount: 0,
    FromSubAccountID: spendFundId}
bytes := new(bytes.Buffer)
json.NewEncoder(bytes).Encode(inputArguments)

// set up the url to call
endpoint := fmt.Sprintf(ADD_FUNDS_ENDPOINT, billSetAsideId)
url := LOCAL_BASE + endpoint

client := &http.Client{}

req, err := http.NewRequest("POST", url, bytes)
if err != nil {
    fmt.Println("ERROR WHILE BUILDING REQUEST")
    fmt.Println(err)
}

req.Header.Add("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
    fmt.Println("ERROR WHILE MAKING REQUEST")
    fmt.Println(err)
}
fmt.Println(resp)

resp, err := http.Post(url, "application/json; charset=utf-8", bytes)
if err != nil {
    fmt.Println("ERROR WHILE MAKING REQUEST")
    fmt.Println(err)
}
fmt.Println(resp)

我添加了一个打印输出,看看URL和JSON正文是否正确,它们似乎是:

fmt.Printf("\nMaking request to %s with:\n %s\n", url, bytes)

打印出来

Making request to http://localhost:11400/sub-accounts/167/add-funds with:
{"amount":1100,"bufferAmount":0,"fromSubAccountId":166}

但是在运行时我得到403 Forbidden。

我可以使用Postman和以下Curl命令来点击此终点:

curl -H "Content-Type: application/json" -X POST -d '{"amount":1100,"bufferAmount":0,"fromSubAccountId":166}' http://localhost:11400/sub-accounts/167/add-funds

有没有人对我在这里失踪的内容有任何想法?为了进一步添加阴谋,我可以成功地从Go程序中找到一个不同的GET端点。

提前致谢!

编辑以表明我正在捕捉错误以及创建URL和JSON正文的周围逻辑

4 个答案:

答案 0 :(得分:0)

您没有显示bytes是什么,但这很可能是问题所在:NewRequestPost都需要io.Reader并从该阅读器中读取正文。这种读数通常只发生一次(想想一个流)。当fmt.Printf("%s") io.Reader此打印将使用内容(最有可能通过调用String()方法)并且实际请求是使用主体完成的。

始终显示整个代码。并且不要尝试从io.Reader读取两次。

答案 1 :(得分:0)

我假设有2个Go应用并在不同的主机上运行,​​这会导致CORS问题。请考虑在您的服务中添加Access-Control-Allow-Origin与您客户的主机。

w.Header().Set("Access-Control-Allow-Origin", "*")

您可以使用客户端应用程序运行的指定主机名更改*

答案 2 :(得分:0)

OMG ....我刚刚发现了这个问题。事实证明它失败了(正如我所期待的那样),但它错误地将它作为403而不是400返回。呃......有时当你长时间盯着某些东西时,明显的事情完全逃脱了注意。 / p>

答案 3 :(得分:0)

您应在请求标头中设置User-Agent

req, _ := http.NewRequest(http.MethodGet, urlString, nil)
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36")