Go语言实现一个Http Server框架(一) http库的使用

 更新时间:2023年04月28日 09:32:53   作者:upper  
本文主要介绍用Go语言实现一个Http Server框架中对http库的基本使用说明,文中有详细的代码示例,感兴趣的同学可以借鉴一下

http库的使用

要实现一个httpServer,首先我们需要先了解一下go语言的原生http库,通常会用到的包括以下几个内容:

  • Body和GetBody
  • URL
  • Method
  • Header
  • Form

Body和GetBody

Body一般用于获取请求体,但是他有一个问题,因为Body本身是一个流,所以只能读一次,这也就意味着,如果我们有重复读取Body的需要,就必须手动进行处理否则程序会出问题

func readBodyOnce(w http.ResponseWriter, r *http.Request)  {
	body, err := io.ReadAll(r.Body)
	if err != nil {
		fmt.Fprintf(w, "read body failed: %v", err)
		// 记住要返回,不然就还会执行后面的代码
		return
	}
	// 类型转换,将 []byte 转换为 string
	fmt.Fprintf(w, "read the data: %s \n", string(body))

	// 尝试再次读取,啥也读不到,但是也不会报错
	body, err = io.ReadAll(r.Body)
	if err != nil {
		// 不会进来这里
		fmt.Fprintf(w, "read the data one more time got error: %v", err)
		return
	}
	fmt.Fprintf(w, "read the data one more time: [%s] and read data length %d \n", string(body), len(body))
}

GetBody原则上是允许重复读取的,但是它会返回一个nil,一般用于处理客户端请求,详情参考官方文档 在服务端处理请求的时候,不建议使用

func getBodyIsNil(w http.ResponseWriter, r *http.Request) {
	if r.GetBody == nil {
		fmt.Fprint(w, "GetBody is nil \n")
	} else {
		fmt.Fprintf(w, "GetBody not nil \n")
	}
}

URL

Request.URL.Query

用于获取queryParam,所有的值在获取到的时候都是字符串,因此拿到参数后需要自行处理

func queryParams(w http.ResponseWriter, r *http.Request) {
	values := r.URL.Query()
	fmt.Fprintf(w, "query is %v\n", values)
}

Request.URL

包含request请求中一些有用的信息,但是不一定都有,实际使用时需要做一下校验

  • Request.URL里的HOST不一定有值
  • Request.Host一般有值
  • RawPath也不一定有值
  • Path肯定有值

Header

用于获取请求头

func header(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "header is %v\n", r.Header)
}

Method

用于获取请求方法

func method(w http.ResponseWriter, r *http.Request) {  
    fmt.Fprintf(w, "Method is %v\n", r.Method)  
}

Form

用于处理formData,在使用时要先调用ParseForm,请求头建议加上:Content-Type: application/x-www-form-urlencoded,因为某些原因还无法处理multipart/form-data

到此这篇关于Go语言实现一个Http Server框架(一) http库的使用的文章就介绍到这了,更多相关Go语言 Http Server框架内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入学习Golang的流程控制

    深入学习Golang的流程控制

    Go 语言是一门现代化的编程语言,以其简洁高效、并发安全等特点被越来越多的开发者所使用。本文将深入探讨 Go 语言中的流程控制,包括条件语句、循环语句以及控制语句等方面
    2023-05-05
  • golang 执行命令行的实现

    golang 执行命令行的实现

    本文主要介绍了golang 执行命令行的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Go语言定时任务cron的设计与使用

    Go语言定时任务cron的设计与使用

    这篇文章主要为大家详细介绍了Go语言中定时任务cron的设计与使用,文中的示例代码讲解详细,对我们深入掌握Go语言有一定的帮助,需要的可以参考下
    2023-11-11
  • 解决go语言ssh客户端密码过期问题

    解决go语言ssh客户端密码过期问题

    这篇文章主要介绍了go语言ssh客户端解决密码过期问题,本文给大家分享了解决的方法和原理,非常不错,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Golang中的path/filepath包用法

    Golang中的path/filepath包用法

    这篇文章主要介绍了Golang中的path/filepath包用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang 统计字符串字数的方法示例

    Golang 统计字符串字数的方法示例

    本篇文章主要介绍了Golang 统计字符串字数的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Go1.18都出泛型了速来围观

    Go1.18都出泛型了速来围观

    泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型,本文通过例子给大家介绍下如何使用泛型,对Go1.18泛型相关知识感兴趣的朋友一起看看吧
    2022-03-03
  • GO语言创建钱包并遍历钱包(wallet)的实现代码

    GO语言创建钱包并遍历钱包(wallet)的实现代码

    比特币钱包实际上是一个密钥对,当你安装 一个钱包应用,或者是使用一个比特币客户端来生成一个新地址是,他就会为你生成一个密钥对,今天通过本文给大家分享go语言遍历钱包的相关知识,一起看看吧
    2021-05-05
  • Go语言开发框架反射机制及常见函数示例详解

    Go语言开发框架反射机制及常见函数示例详解

    这篇文章主要为大家介绍了Go语言开发框架反射机制及常见函数示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Golang中实现类似类与继承的方法(示例代码)

    Golang中实现类似类与继承的方法(示例代码)

    这篇文章主要介绍了Golang中实现类似类与继承的方法,Go语言中通过方法接受者的类型来决定方法的归属和继承关系,本文通过示例代码讲解的非常详细,需要的朋友可以参考下
    2024-04-04

最新评论