广州的房地产网站建设,聊城做网站的公司价位,选择网站建设,沙坪坝网站建设公司选哪家好什么是request http消息分为request#xff08;请求#xff09; 和 response#xff08;响应#xff09; request#xff1a;在go中是一个struct#xff0c;代表了客户段发送的http请求#xff0c;已可以通过request 的方法访问请求中的cookie、URL、User Agent#xf…什么是request http消息分为request请求 和 response响应 request在go中是一个struct代表了客户段发送的http请求已可以通过request 的方法访问请求中的cookie、URL、User Agent查询字符串等信息。 Request Header 请求和响应的headers是通过Header来描述的它是一个map用来表示Http Header里的Key-Value. 获取Header request.Header获取整个haeder的map信息 request.Header[{key}] 获取header中的指定key的value的切片 request.Header.Get({key}) 返回获取header中的指定key的value字符传多个值以逗号分隔
import (fmtnet/http
)func main() {server : http.Server{Addr: localhost:8080,}http.HandleFunc(/test, func(writer http.ResponseWriter, request *http.Request) {fmt.Println(request.Header)fmt.Println(request.Header[Accept-Encoding])fmt.Println(request.Header.Get(Accept-Encoding))})server.ListenAndServe()
}处理请求参数
get请求处理
request.URL.RawQuery:获取参数字符串。
request.URL.Query():获取请求参数字符串对应的map[String][]String,值为切片的原因是key有可能重复。
request.URL.Query({key}):获取对应请求参数的第一个值。
package mainimport (fmtnet/http
)func main() {server : http.Server{Addr: localhost:8080,}http.HandleFunc(/test, func(writer http.ResponseWriter, request *http.Request) {//request.URL.RawQuery:获取参数字符串query : request.URL.RawQueryfmt.Println(query)//request.URL.Query():获取请求参数字符串对应的map[String][]String,值为切片的原因是key有可能重复values : request.URL.Query()fmt.Println(values)//request.URL.Query({key}):获取对应请求参数的第一个值get : request.URL.Query().Get(name)fmt.Println(get)writer.Write([]byte(请求成功))})server.ListenAndServe()
}form表单请求处理
请求包含的内容 html表单中的数据会以name-value对的形式如果通过get请求数据通过url的name-value来发送如果post请求发送数据内容放在post请求的body中name-value数据格式可以通过表单的Content Type指定也就是enctype
enctype的值如下
application/x-www-form-urlencoded默认值表单数据编码到请求字符串里面适用于文本请求multipart/form-data每一对name-value都会转换为MIME消息部分每一部分都有自己的Content Type 和Content Disposition适用大量数据例如上传文件text/plainhtml5浏览器需要支持的内容
不同请求对应的处理 Request允许我们从URL或/和Body中提取请求数据先调用ParseForm 或者 parseMultipartForm 解析Request然后在访问相应的Form、PostForm、MultipartForm获取数据
htmltitle测试表单请求/titlebodyform actionhttp://localhost:8080/test?first_nameurlData methodpost enctypeapplication/x-www-form-urlencodedinput typetext namefirst_name /br /input typetext namelast_name /br /input typesubmit value提交//form/body
/html
package mainimport (fmtnet/http
)func main() {server : http.Server{Addr: localhost:8080,}http.HandleFunc(/test, func(writer http.ResponseWriter, request *http.Request) {//先调用 request.ParseForm 解析request再获取from数据-request.Form/request.PostFormrequest.ParseForm()fmt.Fprintln(writer, request.Form)fmt.Fprintln(writer, request.PostForm)})server.ListenAndServe()
}第二行比第一行返回中少了url中first_name的值 Formrequest.Form返回map格式的参数信息如果url中有和表单中相同的key表单数据在前url中数据在后
PostForm: request.PostForm,只获取表单中的数据
MultipartForm对应from表单中的enctype multipart/form-data需要先调用parseMultipartForm解析请求会返回一个structstruct有两个map第一个map是from表单中的数据第二个map是上传的文件。
htmltitle测试表单请求/titlebodyform actionhttp://localhost:8080/test?first_nameurlData methodpost enctypemultipart/form-datainput typetext namefirst_name /br /input typetext namelast_name /br /input typefile namemyFile/br /input typesubmit value提交//form/body
/html
package mainimport (fmtnet/http
)func main() {server : http.Server{Addr: localhost:8080,}http.HandleFunc(/test, func(writer http.ResponseWriter, request *http.Request) {request.ParseMultipartForm(1024)fmt.Fprintln(writer, request.MultipartForm)})server.ListenAndServe()
}FormValue:获取form字段中指定的key对应的第一个。
valuePostFormValue获取form字段中指定的key对应的第一个value只能获取到form表单中的值
FormValue 和 PostFormValue无需在调用parseForm/ ParseMultipartFormpackage mainimport (fmtnet/http
)func main() {server : http.Server{Addr: localhost:8080,}http.HandleFunc(/test, func(writer http.ResponseWriter, request *http.Request) {v1 : request.FormValue(first_name)v2 : request.FormValue(last_name)v3 : request.PostFormValue(first_name)v4 : request.PostFormValue(last_name)fmt.Println(v1)fmt.Println(v2)fmt.Println(v3)fmt.Println(v4)})server.ListenAndServe()
}上传文件 1.请求的enctype应为multipart/form-data 2.解析request请求request.ParseMultipartForm(1024) 3.获取文件request.MultipartForm.File[myFile][0]myFile对应请求的file的key[0]获取第一个文件
htmltitle测试表单请求/titlebodyform actionhttp://localhost:8080/test?first_nameurlData methodpost enctypemultipart/form-datainput typetext namefirst_name /br /input typetext namelast_name /br /input typefile name myFile/br /input typesubmit value提交//form/body
/html
package mainimport (fmtio/ioutilnet/http
)func main() {server : http.Server{Addr: localhost:8080,}http.HandleFunc(/test, func(writer http.ResponseWriter, request *http.Request) {request.ParseMultipartForm(1024)fileHeader : request.MultipartForm.File[myFile][0]file, err : fileHeader.Open()if err nil {data, err : ioutil.ReadAll(file)if err nil {fmt.Println(string(data))}}})server.ListenAndServe()
} Json请求
读取json
1.使用解码器dec : json.NewDecoder(request.Body)
2.在解码器上进行解码err : dec.Decode(struct的实例)
写入json
使用编码器 enc : json.NewEncoder(writer)
编码err enc.Encode(struct的实例)
package mainimport (encoding/jsonfmtnet/http
)func main() {server : http.Server{Addr: localhost:8080,}http.HandleFunc(/test, func(writer http.ResponseWriter, request *http.Request) {// 读取json// 1.解码dec : json.NewDecoder(request.Body)// 1.转换为结构体company : Company{}err : dec.Decode(company)//3.打印数据if err nil {fmt.Println(company)}// 返回json//1.获取编码器enc : json.NewEncoder(writer)//2.对struct编码err enc.Encode(company)if err nil {//3.向请求输出jsonwriter.WriteHeader(http.StatusInternalServerError)return}})server.ListenAndServe()
}/*
创建和json结构一致的 struct
{id:1,name:xiaoqiang,country:China}
*/
type Company struct {ID int json:idName string json:nameCountry string json:country
}