代码之家  ›  专栏  ›  技术社区  ›  AppTest

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

  •  0
  • AppTest  · 技术社区  · 3 年前

    我正在尝试向我的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:  
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   Cerise Limón    3 年前

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

    这个 ServeMux documentation 描述了重定向:

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

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

    http.HandleFunc("/getRes", getRes)
    

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

    fetch("getRes/", {