Go语言从入门到精通-06| Web服务完善之HTML文件支持

栏目: 服务器 · 发布时间: 5年前

内容简介:请从github下载配套代码:前面我们实现了一个最简单的Web服务器软件。这个服务器软件很傻,无论你的URL是什么,所有请求都只返回“Hello World!”字符串。而且这个字符串是写死在代码中的。接下来我们继续完善这个Web服务器软件,今天我们增加对普通静态文件的支持。也就是当用户通过浏览器向该服务器发送请求的时候该软件会从磁盘上读取相应的文件,然后发送给浏览器。本次的完善也是很有限的,只对上次的代码做了很小的改动。这里实现的主要功能是

请从github下载配套代码: https://github.com/shuningzhang/learn_golang

前面我们实现了一个最简单的Web服务器软件。这个服务器软件很傻,无论你的URL是什么,所有请求都只返回“Hello World!”字符串。而且这个字符串是写死在代码中的。

Go语言从入门到精通-06| Web服务完善之HTML文件支持

Go语言从入门到精通-06| Web服务完善之HTML文件支持

接下来我们继续完善这个Web服务器软件,今天我们增加对普通静态文件的支持。也就是当用户通过浏览器向该服务器发送请求的时候该软件会从磁盘上读取相应的文件,然后发送给浏览器。本次的完善也是很有限的,只对上次的代码做了很小的改动。这里实现的主要功能是 从磁盘读取一个文件的内容,然后封装http响应头后发生给浏览器 。因此,这里主要涉及到 Go语言文件访问相关的库 的使用。最后实现的效果就是在浏览器上显示html文件渲染后的内容:

Go语言从入门到精通-06| Web服务完善之HTML文件支持

图1 实现效果图

文件访问库

由于涉及到文件的访问,因此这里先介绍一下文件相关的包。Go语言文件相关的操作在os包里面,其中os.File封装了文件读写相关的操作。如下是os包及File涉及的主要函数和方法,由于篇幅问题,这里只保留的必要的内容:

type File

File代表一个打开的文件对象。

* func Open(name string) (file File, err error)

Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。

* func OpenFile(name string, flag int, perm FileMode) (file File, err error)

OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。

* func (f File) Read(b []byte) (n int, err error)

Read方法从f中读取最多len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。文件终止标志是读取0个字节且返回值err为io.EOF。

* func (f File) Write(b []byte) (n int, err error)

Write向文件中写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。

* func (f File) Close() error

Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。

下面是本文实现的从文件读取数据的方法,在Web服务的主程序中通过调用该方法来从磁盘读取数据。这个方法的输入是文件路径,输出是文件的内容。

Go语言从入门到精通-06| Web服务完善之HTML文件支持

图2 文件读取方法实现

细心的同学可能已经发现,我们这里读取数据并没有用File的Read方法,而是用了另外一个包ioutil的ReadAll方法。这里使用ioutil包的方法也是作为一个引子,期望大家更多的了解 Go 语言提供的库函数。该方法与File的Read方法功能是一样的,但性能上要好一些。

ioutil包是一个io相关的包,提供了对常见io操作的性能优化,该包提供的功能主要包括:

func ReadAll(r io.Reader) ([]byte, error)

从一个io.Reader读取所有数据,并返回一个字节数组

func ReadDir(dirname string) ([]os.FileInfo, error)

从一个目录读取数据,并得到这个目录里的文件对象列表

func ReadFile(filename string) ([]byte, error)

读取指定文件的内容,并返回一个字节数组

关于文件操作的相关介绍本文先到这里,更详细的介绍我们后面专门另起新文介绍。

Web服务修改

Web服务端改动的地方也很少,除了上面介绍的读取文件内容的方法外,在主函数中调整了数据发送方面的代码,其它地方均没有做改动。下面是涉及到的代码片段。

Go语言从入门到精通-06| Web服务完善之HTML文件支持

图3 服务端代码修改

如图3所示,这里一共修改了3个地方:

  1. 读取文件(固定的文件),并计算文件的长度
  2. 构造http响应头,这里主要是根据文件大小,调整Content-Length字段
  3. 分别发送响应头和响应体

测试验证

完成上述修改后,我们就可以通过浏览器进行验证了。这里需要具备一个html文件,该文件保存在与服务端相同的路径下面,名称为index.html。该文件的内容如下:

Go语言从入门到精通-06| Web服务完善之HTML文件支持

图4 HTML文件内容

如果熟悉html的同学,很清楚是做什么的,就是现实一个红色的“Hello World!”字符串,不了解html的同学也没关系,了解到这里就行。

在服务端运行程序, 浏览器数据地址后回车,可以看到如下内容:

Go语言从入门到精通-06| Web服务完善之HTML文件支持

图5 最终效果图

好了,今天先到这,后面文章我们将增加对图片的支持。


以上所述就是小编给大家介绍的《Go语言从入门到精通-06| Web服务完善之HTML文件支持》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Tagging

Tagging

Gene Smith / New Riders / 2007-12-27 / GBP 28.99

Tagging is fast becoming one of the primary ways people organize and manage digital information. Tagging complements traditional organizational tools like folders and search on users desktops as well ......一起来看看 《Tagging》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具

html转js在线工具
html转js在线工具

html转js在线工具