我有一个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正文的周围逻辑
答案 0 :(得分:0)
您没有显示bytes
是什么,但这很可能是问题所在:NewRequest
和Post
都需要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)
答案 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")