PHP转GO,全是干货。GoLang基础知识(二)

141 阅读2分钟

一、URL 路径解析

goblog 中 URL 路径解析的代码如下:

http.HandleFunc("/", handlerFunc)

这段代码中反斜杠 / 并不是站点的根目录,而是代表任意路径

我们可以利用此机制来设置多页面访问,修改代码如下:

package main

import (
    "fmt"
    "net/http"
)

func handlerFunc(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path == "/" {
        fmt.Fprint(w, "<h1>Hello, 这里是 goblog</h1>")
    } else if r.URL.Path == "/about" {
        fmt.Fprint(w, "此博客是用以记录编程笔记,如您有反馈或建议,请联系 "+
            "<a href=\"mailto:summer@example.com\">summer@example.com</a>")
    } else {
        fmt.Fprint(w, "<h1>请求页面未找到 :(</h1>"+
            "<p>如有疑惑,请联系我们。</p>")
    }
}

func main() {
    http.HandleFunc("/", handlerFunc)
    http.ListenAndServe(":3000", nil)
}

我们现在有两个问题。

第一个问题是修改代码后都需要手动去 Ctrl+C 停止 go run 命令,再重新运行。效率低下。

第二个问题是 about 页面的解析并不如我们的预想的那样,客户端并没有将内容按照 HTML 格式来解析。

二、### 查看标头信息 什么是 HTTP 标头?

HTTP 请求是无状态的,HTTP 标头是客户端与服务端通讯的重要方式。

设置标头

如何查看标头呢?

访问 learnku.com/ ,网页上右键菜单选择『审查元素』,选中『网络』栏目,为方便区分我们点击前面的小三角形进行折叠:

image

查看响应标头:

image

浏览器 localhost:8080 ,右键查看网络请求:

image

可以看到的我们的 Web 服务器只返回了几个标头,且 Content-Type: 的内容为 text/html; charset=utf-8。

Content-Type 标头

Content-Type: 响应标头是告知客户端内容的类型,客户端再根据这个信息将内容正确地呈现给用户。

常见的内容类型有:

  • text/html —— HTML 文档
  • text/plain —— 文本内容
  • text/css—— CSS 样式文件
  • text/javascript —— JS 脚本文件
  • application/json—— JSON 格式的数据
  • application/xml —— XML 格式的数据
  • image/png —— PNG 图片

接下来我们将尝试服务端返回正确的 Content-Type: 标头。

返回正确的 Content-Type:

package main

import (
    "fmt"
    "net/http"
)

func handlerFunc(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "text/html; charset=utf-8")
    if r.URL.Path == "/" {
        fmt.Fprint(w, "<h1>Hello, 欢迎来到 goblog!</h1>")
    } else if r.URL.Path == "/about" {
        fmt.Fprint(w, "此博客是用以记录编程笔记,如您有反馈或建议,请联系 "+
            "<a href=\"mailto:summer@example.com\">summer@example.com</a>")
    } else {
        fmt.Fprint(w, "<h1>请求页面未找到 :(</h1>"+
            "<p>如有疑惑,请联系我们。</p>")
    }
}

func main() {
    http.HandleFunc("/", handlerFunc)
    http.ListenAndServe(":8080", nil)
}

浏览器访问 localhost:8080/about

image

如何知道 http 包有哪些接口呢?

那么我们怎么知道 w 对象所代表的 http.ResponseWriter 有哪些接口的呢?

答:看 Go 文档。

如果你觉得我的文档能给你带来帮助,请不要吝啬你的赞哦~~