【问题标题】:Ajax Request not sending to Go web serverAjax 请求未发送到 Go Web 服务器
【发布时间】:2015-01-26 01:48:10
【问题描述】:

我刚开始学习 Web 开发、Go 和 Ajax,但我很难看出哪里出了问题。我试图简单地在客户端和服务器之间来回发送数据。通过 Ajax 请求,我将数据从表单发送到服务器,但它似乎没有到达服务器,因为日志没有打印“在 posthandler 中”,这导致我认为 ajax 请求有问题。附上main.go、index.html、js/getData.js及所有相关代码。

main.go

package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
    "log"
)

var INDEX_HTML []byte

func main(){
    fmt.Println("starting server on http://localhost:8888/\nvalue is %s", value)
    http.HandleFunc("/", IndexHandler)
    http.HandleFunc("/post", PostHandler)
    http.ListenAndServe(":8888", nil)
}

func IndexHandler(w http.ResponseWriter, r *http.Request){
    log.Println("GET /")
    w.Write(INDEX_HTML)
}

func PostHandler(w http.ResponseWriter, r *http.Request){
    r.ParseForm()
    log.Println("in posthandler", r.Form)
    var value = r.FormValue("textfield")
    w.Write([]byte(value))
}
func init(){
    INDEX_HTML, _ = ioutil.ReadFile("./html/index.html")
}

index.html

<!doctype html>
<html>
  <head>
    <title>Page Title</title>
  <script src="js/getData.js"></script>
  </head>
  <body>
    <form action="/post" method="post">
      <textarea type="text" name="input" id="textfield"></textarea>
      <br />
      <input type="submit" name="button" id="button" value="Send" onclick="loadXMLDoc()"/>
    </form>
    <div id="fromserver">
    </div>
  </body>
</html>

js/getData.js

function loadXMLDoc() {
    var xmlhttp;
    xmlhttp=new XMLHttpRequest();
    xmlhttp.onreadystatechange=function()
    {
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        document.getElementById("fromserver").innerHTML=xmlhttp.responseText;
    }
    }
    xmlhttp.open("POST","post",true);
    xmlhttp.send();
}

【问题讨论】:

    标签: ajax go


    【解决方案1】:

    有两件事:

    • 不存在用于呈现资产的处理程序(在本例中为 js/.
    • 由于“提交”HTML 元素,表单本身会被提交。

    这是您的更新代码

    main.go

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "log"
        "net/http"
    )
    
    var INDEX_HTML []byte
    
    func main() {
        fmt.Println("starting server on http://localhost:8888/\nvalue is %s", "asdf")
        http.HandleFunc("/", IndexHandler)
        http.HandleFunc("/post", PostHandler)
        serveSingle("/js/getData.js", "./js/getData.js")
        http.ListenAndServe(":8888", nil)
    }
    
    func serveSingle(pattern string, filename string) {
        http.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) {
            http.ServeFile(w, r, filename)
        })
    }
    
    func IndexHandler(w http.ResponseWriter, r *http.Request) {
        log.Println("GET /")
        w.Write(INDEX_HTML)
    }
    
    func PostHandler(w http.ResponseWriter, r *http.Request) {
        r.ParseForm()
        log.Println("in posthandler", r.Form)
        var value = r.FormValue("textfield")
        w.Write([]byte(value))
    }
    func init() {
        INDEX_HTML, _ = ioutil.ReadFile("./html/index.html")
    }
    

    index.html

    <!doctype html>
    <html>
      <head>
        <title>Page Title</title>
      <script src="js/getData.js"></script>
      </head>
      <body>
        <form action="/post" method="post">
          <textarea type="text" name="input" id="textfield"></textarea>
          <br />
          <input type="button" name="button" id="button" value="Send" onclick="loadXMLDoc()"/>
        </form>
        <div id="fromserver">
        </div>
      </body>
    </html>
    

    【讨论】:

    • js 函数现在确实发送到 posthandler,现在 url 更改为 localhost:8888/post 但页面为空白。我怎样才能让客户在同一页面上说只有 div id="fromserver" 随 ajax 调用中的数据而变化?另外,如果我要使用包含很多文件的 jquery,我需要为每个文件使用 singleServe() 吗?
    • 对于 jquery 你可以添加一个处理给定目录中所有文件的hadler,比如http.Handle("/jquery", http.FileServer(http.Dir("/path/to/jquery")))
    • @user2807904,根据您最初的问题,我认为您需要使其工作并了解自己出了什么问题。无论如何,请阅读此link 以了解如何呈现静态资产。
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多