GoLang—使用net/http构建Web服务(处理用户请求)

14 篇文章 2 订阅

一般而言,用户发送的HTTP请求主要分为GET请求和POST请求,如果Web服务是使用net/http开发,那么如何接收和处理用户的HTTP请求呢?本文将会简单讲述如何使用net/http接收和处理用户的HTTP请求。
如果了解标准库net/http的使用方法都知道,路由的处理函数设有两个参数,分别为w http.ResponseWriter和r *http.Request。参数w是http.ResponseWriter类型,代表用户的响应对象;参数r是http.Request,代表用户的请求信息。因此,用户的所有请求信息都来自参数r,接下来将深入讲述参数r的使用方法,我们直接上代码,如下所示。

package main

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

func body(w http.ResponseWriter, r *http.Request) {
	// 获取请求头信息:r.Header
	// 获取请求头的某条信息:h := r.Header["Accept-Encoding"]或h := r.Header.Get("Accept-Encoding")
	// 判断请求方式
	if r.Method == "GET"{
		// 方法1:获取GET请求的请求参数,接收application/x-www-form-urlencoded编码的数据
		//r.ParseForm()
		//fmt.Println(r.Form["name"])
		// 方法2:获取GET请求的请求参数,接收application/x-www-form-urlencoded编码的数据
		fmt.Println(r.URL.Query())
		// 方法3:获取GET请求的请求参数,接收application/x-www-form-urlencoded编码的数据。
		fmt.Println(r.FormValue("name"))
		// 响应内容
		fmt.Fprintln(w, r.FormValue("name"))
	} else {
		// 方法1:获取POST请求的请求参数
		// 分别使用Form和PostForm方法获取POST的请求参数
		// 使用Form和PostForm之前必须调用ParseForm方法
		// 接收application/x-www-form-urlencoded编码的数据
		//r.ParseForm()
		//fmt.Println(r.Form["name"][0])
		//fmt.Println(r.PostForm["name"][0])

		// MultipartForm用于文件上传,使用前需要调用ParseMultipartForm方法
		// 接收multipart/form-data编码
		// 注意:FormFile是MultipartForm的简化功能
		//r.ParseMultipartForm(1024)
		//fmt.Println(r.MultipartForm)

		// 方法2:获取POST请求的请求参数,但无法获取Multipart编码,即无法读取文件上存的数据
		// FormValue将Form的功能简化,接收application/x-www-form-urlencoded编码的数据
		// 注意:PostFormValue将PostForm的功能简化,接收application/x-www-form-urlencoded编码的数据
		fmt.Println(r.FormValue("name"))

		// 方法3:接收POST的JSON数据,因为JSON数据使用application/json编码
		con, _ := ioutil.ReadAll(r.Body)
		fmt.Println(string(con))

		// 响应内容
		fmt.Fprintln(w, r.FormValue("name"))
	}
}

func main() {
	server := http.Server{
			Addr: "127.0.0.1:8000",
		}
	// 定义路由与路由的处理函数body
	http.HandleFunc("/", body)
	// 运行服务
	server.ListenAndServe()
}

从上述代码看到,我们分别获取用户的请求头和请求参数,这两个数据是日常开发中最为常用的。请求头由参数r调用Header方法即可;请求参数则由参数r调用Form、PostForm、FormValue、PostFormValue、MultipartForm和FormFile方法获取参数值,每一种方法有特定的使用场景,说明如下。

  • Form:存储了post、put和get的请求参数,在使用之前需要调用ParseForm方法,接收application/x-www-form-urlencoded编码的请求参数。
  • FormValue:简化Form的使用方式,无需调用ParseForm或ParseMultipartForm方法。
  • PostForm:存储了post、put的请求参数,在使用之前需要调用ParseForm方法,接收application/x-www-form-urlencoded编码的请求参数。
  • PostFormValue:简化PostForm的使用方式,无需调用ParseForm或ParseMultipartForm方法。
  • MultipartForm:存储了包含了文件上传的表单的post请求的请求参数,在使用前需要调用ParseMultipartForm方法,接收multipart/form-data编码的请求参数。
  • FormFile:简化MultipartForm的使用方法,无需调用ParseForm或ParseMultipartForm方法。

综合上述,本文简单讲述如何使用net/http接收和处理用户的HTTP请求,下一节将讲述如何生成响应内容和使用Cookie。

注意,net/http的路由定义有很大局限性,建议使用httprouter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xy-Huang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值