从网页向Go服务器发送JSON对象



我正在尝试向Go服务器发送一个JSON对象。我看了所有我能找到的例子,但不知道我遗漏了什么。

服务器代码:

package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"text/template"
)
func handler(w http.ResponseWriter, r *http.Request) {
t, err := template.ParseFiles("list.html")
if err != nil {
fmt.Println("Failed to parse")
log.Fatal(err)
}
m := make(map[string]string)
m["Title"] = "A title"
err = t.Execute(w, m)
if err != nil {
fmt.Println("Failed to execute")
log.Fatal(err)
}
}
func getRes(w http.ResponseWriter, r *http.Request) {
fmt.Println("HEADER: ", r.Header)
fmt.Println("CL: ", r.ContentLength)
fmt.Println("CT: ", r.Header.Get("Content-Type"))
b, err := ioutil.ReadAll(r.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println("B: ", string(b))
}
func main() {
fmt.Println("Starting")
http.HandleFunc("/", handler)
http.HandleFunc("/getRes/", getRes)
log.Fatal(http.ListenAndServe(":8080", nil))
}

当我使用卷曲时,这很有效。

curl --header "Content-Type: application/json" -d "{"rating":3}" http://localhost:8080/getRes/

我得到的回复是:

HEADER:  map[Accept:[*/*] Content-Length:[12] Content-Type:[application/json] User-Agent:[curl/7.58.0]]
CL:  12
CT:  application/json
B:  {"rating":3}

当我使用以下HTML/Javascript代码时,它不起作用:

<html>
<head>
<script>
window.onload = function() {
fetch("getRes", {

"method": "POST",

"body": JSON.stringify({
"rating": 5
}),

"headers": {
"Content-type": "application/json"
}
});
}
</script>
</head>
<body>
{{.Title}}
</body></html>

我收到了一个响应,但它是空的,内容长度为零:

HEADER:  map[Accept:[*/*] Accept-Encoding:[gzip, deflate, br] Accept-Language:[en-GB,en-US;q=0.9,en;q=0.8] Connection:[keep-alive] Referer:[http://localhost:8080/] Sec-Fetch-Mode:[cors] Sec-Fetch-Site:[same-origin] User-Agent:[Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36]]
CL:  0
CT:  
B:  

页面POST到路径/getres。mux将客户端重定向到/getres/,因为没有为/getres注册的处理程序,但为/getres/注册了。重定向是一个没有正文的GET请求。

ServeMux文档描述了重定向:

如果已经注册了一个子树,并且收到了一个命名该子树根而没有其尾部斜杠的请求,ServeMux会将该请求重定向到该子树根(添加尾部斜杠(。

通过注册路径/getres的处理程序进行修复

http.HandleFunc("/getRes", getRes)

或者通过张贴到路径/getRes/:

fetch("getRes/", {

最新更新