Go Web 编程,一书中4.1节 求问 输入127.0.0.1:9090/login 返回页面html内容?

创建一个web服务器,go服务端

package main
import (
    "fmt"
    "html/template"
    "log"
    "net/http"
    "strings"
)

func sayhelloName(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()       //解析url传递的参数,对于POST则解析响应包的主体(request body)
    //注意:如果没有调用ParseForm方法,下面无法获取表单的数据
    fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
    fmt.Println("path", r.URL.Path)
    fmt.Println("scheme", r.URL.Scheme)
    fmt.Println(r.Form["url_long"])
    for k, v := range r.Form {
        fmt.Println("key:", k)
        fmt.Println("val:", strings.Join(v, ""))
    }
    fmt.Fprintf(w, "Hello astaxie!") //这个写入到w的是输出到客户端的
}

func login(w http.ResponseWriter, r *http.Request) {
    fmt.Println("method:", r.Method) //获取请求的方法
    if r.Method == "GET" {
        t, _ := template.ParseFiles("login.gtpl")
        t.Execute(w, nil)

    } else {
        //请求的是登陆数据,那么执行登陆的逻辑判断
        r.ParseForm()
        fmt.Println("username:", r.Form["username"])
        fmt.Println("password:", r.Form["password"])
    }
}

func main() {
    http.HandleFunc("/", sayhelloName)       //设置访问的路由
    http.HandleFunc("/login", login)         //设置访问的路由
    err := http.ListenAndServe(":9090", nil) //设置监听的端口
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

login.gtpl文件为:

<html>
<head>
<title></title>
</head>
<body>
<form action="/login" method="post">
    用户名:<input type="text" name="username">
    密码:<input type="password" name="password">
    <input type="submit" value="登陆">
</form>
</body>
</html>

怎么我打开浏览器,输入网址:127.0.0.1:9090/login后直接返回 login文件的内容,代码完全从书籍上面拷贝下来。

共 9 个回复


jimmykuu

你用什么浏览器?

# 0

swinghu

chrome 浏览器,我感觉好奇怪,怎么直接返回 html文件了。

# 1

swinghu

360 浏览器也是一样,直接返回 html里面的内容。

# 2

nowayout

你需要在前面添加代码:

ctx.ResponseWriter.Header().Set("Content-Type", "text/html; charset=utf-8")
# 3

jimmykuu

我在Chrome和Safari中测试都是正常的。

这是用wget命令返回的信息

> wget http://127.0.0.1:9090/login
--2014-03-05 17:24:08--  http://127.0.0.1:9090/login
Connecting to 127.0.0.1:9090... connected.
HTTP request sent, awaiting response... 200 OK
Length: 247 [text/html]
Saving to: 'login'

100%[==================================================================================================================================================================>] 247         --.-K/s   in 0s

2014-03-05 17:24:08 (23.6 MB/s) - 'login' saved [247/247]
# 4

swinghu

nowayout 正解,通过在以上代码

 t, _ := template.ParseFiles("login.gtpl")

后面添加代码

w.Header().Set("Content-Type", "text/html; charset=utf-8")// fix the the return html file

问题解决,我想问,是不是我的 Notepad++ 字符编码的问题?

# 5

nowayout

不是编码问题,应该主要是需要:

w.Header().Set("Content-Type", "text/html;")
# 6

peperyin

login.gtpl, 文件怎么保存为gtpl?

# 7

sunxueyang

也可以不用完全按照样例来,直接创建html文件即可,这样就没有输出识别问题了。@peperyin

# 8