403进行Golang POST时禁止使用

问题描述 投票:-1回答:4

我有一个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主体的周围逻辑

go http-status-code-403
4个回答
0
投票

你没有展示bytes是什么,但这很可能是问题:NewRequestPost都采取io.Reader并从该读者读取身体。这种读数通常只发生一次(想想一个流)。当你fmt.Printf("%s") io.Reader这个打印将消耗内容(最有可能通过调用String()方法)并且实际请求是使用空体完成的。

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


0
投票

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

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

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


0
投票

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


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")
© www.soinside.com 2019 - 2024. All rights reserved.