当前位置: 首页 > news >正文

开源网站开发文档下载vip解析网站怎么做

开源网站开发文档下载,vip解析网站怎么做,线上平台推广是做什么的,php网站作业模版之前这个系列的文章一直在讲用Go语言怎么编写HTTP服务器来提供服务#xff0c;如何给服务器配置路由来匹配请求到对应的处理程序#xff0c;如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来#xff0c;以及如何更规范地在项目中应用数据库。不过一直漏掉了一个…之前这个系列的文章一直在讲用Go语言怎么编写HTTP服务器来提供服务如何给服务器配置路由来匹配请求到对应的处理程序如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来以及如何更规范地在项目中应用数据库。不过一直漏掉了一个环节是服务器接收到请求后如何解析请求拿到想要的数据Go语言使用net/http包中的Request结构体对象来表示HTTP请求通过Request结构对象上定义的方法和数据字段应用程序能够便捷地访问和设置HTTP请求中的数据。一般服务端解析请求的需求有如下几种HTTP请求头中的字段值URL 查询字符串中的字段值请求体中的Form表单数据请求体中的JSON格式数据读取客户端的上传的文件今天这篇文章我们就按照这几种常见的服务端对HTTP请求的操作来说一下服务器应用程序如何通过Request对象解析请求头和请求体。Request 结构定义在说具体操作的使用方法之前我们先来看看net/http包中Request结构体的定义了解一下Request拥有什么样的数据结构。Request结构在源码中的定义如下。type Request struct {Method stringURL *url.URLProto string // HTTP/1.0ProtoMajor int // 1ProtoMinor int // 0Header HeaderBody io.ReadCloserGetBody func() (io.ReadCloser, error)ContentLength int64TransferEncoding []stringClose boolHost stringForm url.ValuesPostForm url.ValuesMultipartForm *multipart.FormTrailer HeaderRemoteAddr stringRequestURI stringTLS *tls.ConnectionStateCancel -chan struct{}Response *Responsectx context.Context }我们快速地了解一下每个字段大致的含义了解了每个字段的含义在不同的应用场景下需要读取访问HTTP请求的不同部分时就能够有的放矢了。Method指定HTTP方法GETPOSTPUT等。URLURL指定要请求的URI对于服务器请求或要访问的URL用于客户请求。它是一个表示URL的类型url.URL的指针url.URL的结构定义如下type URL struct {Scheme stringOpaque stringUser *UseriHost stringPath stringRawPath stringForceQuery bool RawQuery stringFragment string }ProtoProtoProtoMajorProtoMinor三个字段表示传入服务器请求的协议版本。对于客户请求这些字段将被忽略。 HTTP客户端代码始终使用HTTP / 1.1或HTTP / 2。HeaderHeader包含服务端收到或者由客户端发送的HTTP请求头该字段是一个http.Header类型的指针http.Header类型的声明如下type Header map[string][]string是map[string][]string类型的别名http.Header类型实现了GETSETAdd等方法用于存取请求头。如果服务端收到带有如下请求头的请求Host: example.com accept-encoding: gzip, deflate Accept-Language: en-us fOO: Bar foo: two那么Header的值为Header map[string][]string{Accept-Encoding: {gzip, deflate},Accept-Language: {en-us},Foo: {Bar, two}, }对于传入的请求Host标头被提升为Request.Host字段并将其从Header对象中删除。HTTP 定义头部的名称是不区分大小写的。Go使用CanonicalHeaderKey实现的请求解析器使得请求头名称第一个字母以及跟随在短横线后的第一个字母大写其他都为小写形式比如Content-Length。对于客户端请求某些标头例如Content-Length和Connection会在需要时自动写入并且标头中的值可能会被忽略。Body这个字段的类型是io.ReadCloserBody是请求的主体。对于客户端发出的请求nil主体表示该请求没有Body例如GET请求。 HTTP客户端的传输会负责调用Close方法。对于服务器接收的请求请求主体始终为非nil但如果请求没有主体则将立即返回EOF。服务器将自动关闭请求主体。服务器端的处理程序不需要关心此操作。GetBody客户端使用的方法的类型其声明为GetBody func() (io.ReadCloser, error)ContentLengthContentLength记录请求关联内容的长度。值-1表示长度未知。值0表示从Body 中读取到的字节数。对于客户请求值为0且非nil的Body也会被视为长度未知。TransferEncodingTransferEncoding为字符串切片其中会列出从最外层到最内层的传输编码TransferEncoding通常可以忽略在发送和接收请求时分块编码会在需要时自动被添加或者删除。CloseClose表示在服务端回复请求或者客户端读取到响应后是否要关闭连接。对于服务器请求HTTP服务器会自动处理 并且处理程序不需要此字段。对于客户请求设置此字段为true可防止重复使用到相同主机的请求之间的TCP连接就像已设置Transport.DisableKeepAlives一样。Host对于服务器请求Host指定URL所在的主机为防止DNS重新绑定攻击服务器处理程序应验证Host标头具有的值。 http库中的ServeMux复用器支持注册到特定Host的模式从而保护其注册的处理程序。对于客户端请求Host可以用来选择性地覆盖请求头中的Host如果不设置Request.Write使用URL.Host来设置请求头中的Host。FormForm包含已解析的表单数据包括URL字段的查询参数以及PATCHPOST或PUT表单数据。此字段仅在调用Request.ParseForm之后可用。HTTP客户端会忽略Form并改用Body。Form字段的类型是url.Values类型的指针。url.Values类型的声明如下type Values map[string][]string也是map[string][]string类型的别名。url.Values类型实现了GETSETAddDel等方法用于存取表单数据。PostFormPostForm类型与Form字段一样包含来自PATCHPOST的已解析表单数据或PUT主体参数。此字段仅在调用ParseForm之后可用。HTTP客户端会忽略PostForm并改用Body。MultipartFormMultipartForm是已解析的多部分表单数据包括文件上传。仅在调用Request.ParseMultipartForm之后此字段才可用。HTTP客户端会忽略MultipartForm并改用Body。该字段的类型是*multipart.Form。RemoteAddrRemoteAddr允许HTTP服务器和其他软件记录发送请求的网络地址通常用于记录。 net/http包中的HTTP服务器在调用处理程序之前将RemoteAddr设置为“ IP端口” HTTP客户端会忽略此字段。 RequestURIRequestURI是未修改的request-target客户端发送的请求行RFC 7230第3.1.1节。在服务器端通常应改用URL字段。在HTTP客户端请求中设置此字段是错误的。ResponseResponse字段类型为*Response它指定了导致此请求被创建的重定向响应此字段仅在客户端发生重定向时被填充。ctxctx 是客户端上下文或服务器上下文。它应该只通过使用WithContext复制整个Request进行修改。这个字段未导出以防止人们错误使用Context并更改同一请求的调用方所拥有的上下文。读取请求头上面分析了Go将HTTP请求头存储在Request结构体对象的Header字段里Header字段实质上是一个Map请求头的名称为MapkeyMap Value的类型为字符串切片有的请求头像Accept会有多个值在切片中就对应多个元素。Header类型的Get方法可以获取请求头的第一个值func exampleHandler(w http.ResponseWriter, r *http.Request) {ua : r.Header.Get(User-Agent)... }或者是获取值时直接通过key获取对应的切片值就好比如将上面的改为ua : r.Header[User-Agent]下面我们写个遍历请求头信息的示例程序同时也会通上面介绍的Request结构中定义的MethodURLHostRemoteAddr等字段把请求的通用信息打印出来。在我们一直使用的http_demo项目中增加一个DisplayHeadersHandler其源码如下package handlerimport (fmtnet/http )func DisplayHeadersHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, Method: %s URL: %s Protocol: %s n, r.Method, r.URL, r.Proto)// 遍历所有请求头for k, v : range r.Header {fmt.Fprintf(w, Header field %q, Value %qn, k, v)}fmt.Fprintf(w, Host %qn, r.Host)fmt.Fprintf(w, RemoteAddr %qn, r.RemoteAddr)// 通过 Key 获取指定请求头的值fmt.Fprintf(w, nnFinding value of Accept %q, r.Header[Accept]) } 将其处理程序绑定到/index/display_headers路由上indexRouter.HandleFunc(/display_headers, handler.DisplayHeadersHandler) 然后启动项目打开浏览器访问:http://localhost:8000/index/display_headers可以看到如下输出http_demo项目中已经添加了本文中所有示例的源码关注文末公众号回复gohttp06可以获取源码的下载链接。获取URL参数值GET请求中的URL查询字符串中的参数可以通过url.Query()我们来看一下啊url.Query()函数的源码func (u *URL) Query() Values {v, _ : ParseQuery(u.RawQuery)return v }它通过ParseQuery函数解析URL参数然后返回一个url.Values类型的值。url.Values类型上面我们已经介绍过了是map[string][]string类型的别名实现了GETSETAddDel等方法用于存取数据。所以我们可以使用r.URL.Query().Get(ParamName)获取参数值也可以使用r.URL.Query()[ParamName]。两者的区别是Get只返回切片中的第一个值如果参数对应多个值时比如复选框表单那种请求就是一个name对应多个值记住要使用第二种方式。我们通过运行一个示例程序display_url_params.go来看一下两种获取URL参数的区别package handlerimport ( fmt net/http )func DisplayUrlParamsHandler(w http.ResponseWriter, r *http.Request) {for k, v : range r.URL.Query() {fmt.Fprintf(w, ParamName %q, Value %qn, k, v)fmt.Fprintf(w, ParamName %q, Get Value %qn, k, r.URL.Query().Get(k))} } 将其处理程序绑定到/index/display_url_params路由上indexRouter.HandleFunc(/display_url_params, handler.DisplayUrlParamsHandler) 打开浏览器访问http://localhost:8000/index/display_url_params?abcdac浏览器会输出ParamName a, Value [b c] ParamName a, Get Value b ParamName c, Value [d] ParamName c, Get Value d我们为参数a传递了两个参数值可以看到通过url.Query.Get()只能读取到第一个参数值。获取表单中的参数值Request结构的Form字段包含已解析的表单数据包括URL字段的查询参数以及PATCHPOST或PUT表单数据。此字段仅在调用Request.ParseForm之后可用。不过Request对象提供一个FormValue方法来获取指定名称的表单数据FormValue方法会根据Form字段是否有设置来自动执行ParseForm方法。func (r *Request) FormValue(key string) string {if r.Form nil {r.ParseMultipartForm(defaultMaxMemory)}if vs : r.Form[key]; len(vs) 0 {return vs[0]}return } 可以看到FormValue方法也是只返回切片中的第一个值。如果需要获取字段对应的所有值那么需要通过字段名访问Form字段。如下获取表单字段的单个值r.FormValue(key)获取表单字段的多个值r.ParseForm()r.Form[key]下面是我们的示例程序以及对应的路由//handler/display_form_data.go package handlerimport (fmtnet/http )func DisplayFormDataHandler(w http.ResponseWriter, r *http.Request) {if err : r.ParseForm(); err ! nil {panic(err)}for key, values : range r.Form {fmt.Fprintf(w, Form field %q, Values %qn, key, values)fmt.Fprintf(w, Form field %q, Value %qn, key, r.FormValue(key))} }//router.go indexRouter.HandleFunc(/display_form_data, handler.DisplayFormDataHandler) 我们在命令行中使用cURL命令发送表单数据到处理程序看看效果。curl -X POST -d usernameJamespassword123 http://localhost:8000/index/display_form_data返回的响应如下Form field username, Values [James] Form field username, Value James Form field password, Values [123] Form field password, Value 123获取 CookieRequest对象专门提供了一个Cookie方法用来访问请求中携带的Cookie数据方法会返回一个*Cookie类型的值以及error。Cookie类型的定义如下type Cookie struct {Name stringValue stringPath string // optionalDomain string // optionalExpires time.Time // optionalRawExpires string // for reading cookies onlyMaxAge intSecure boolHttpOnly boolSameSite SameSiteRaw stringUnparsed []string }所以要读取请求中指定名称的Cookie值只需要cookie, err : r.Cookie(name) // 错误检查 ... value : cookie.ValueRequest.Cookies()方法会返回[]*Cookie切片其中会包含请求中所有的Cookie下面的示例程序会打印请求中所有的Cookie// handler/read_cookie.go package handlerimport (fmtnet/http )func ReadCookieHandler(w http.ResponseWriter, r *http.Request) {for _, cookie : range r.Cookies() {fmt.Fprintf(w, Cookie field %q, Value %qn, cookie.Name, cookie.Value)} } //router/router.go indexRouter.HandleFunc(/read_cookie, handler.ReadCookieHandler) 我们通过cURL在命令行请求http://localhost:8000/index/read_cookie curl --cookie USER_TOKENYes http://localhost:8000/index/read_cookie执行命令后会返回Cookie field USER_TOKEN, Value Yes解析请求体中的JSON数据现在前端都倾向于把请求数据以JSON格式放到请求主体中传给服务器针对这个使用场景我们需要把请求体作为json.NewDecoder()的输入流然后将请求体中携带的JSON格式的数据解析到声明的结构体变量中//handler/parse_json_request package handlerimport (encoding/jsonfmtnet/http )type Person struct {Name stringAge int }func DisplayPersonHandler(w http.ResponseWriter, r *http.Request) {var p Person// 将请求体中的 JSON 数据解析到结构体中// 发生错误返回400 错误码err : json.NewDecoder(r.Body).Decode(p)if err ! nil {http.Error(w, err.Error(), http.StatusBadRequest)return}fmt.Fprintf(w, Person: %v, p) }// router/router.go indexRouter.HandleFunc(/parse_json_request, handler.ParseJsonRequestHandler) 在命令行里用cURL命令测试我们的程序curl -X POST -d {name: James, age: 18} -H Content-Type: application/json http://localhost:8000/index/parse_json_request返回响应如下Person: {Name:James Age:18}%读取上传文件服务器接收客户端上传的文件使用Request定义的FormFile()方法。该方法会自动调用r.ParseMultipartForm(32 20)方法解析请求多部表单中的上传文件并把文件可读入内存的大小设置为32M32向左位移20位如果内存大小需要单独设置就要在程序里单独调用ParseMultipartForm()方法才行。func ReceiveFile(w http.ResponseWriter, r *http.Request) {r.ParseMultipartForm(32 20) var buf bytes.Bufferfile, header, err : r.FormFile(file)if err ! nil {panic(err)}defer file.Close()name : strings.Split(header.Filename, .)fmt.Printf(File name %sn, name[0])io.Copy(buf, file)contents : buf.String()fmt.Println(contents)buf.Reset()return } Go语言解析HTTP请求比较常用的方法我们都介绍的差不多了。因为想总结全一点篇幅还是有点长不过整体不难懂而且也可以下载程序中的源码自己运行调试动手实践一下更有助于理解吸收。HTTP客户端发送请求要设置的内容也只今天讲的Request结构体的字段Request对象也提供了一些设置相关的方法供开发人员使用今天就先说这么多了。关注下方公众号回复gohttp06可以下载文章中项目的源码赶快下载下来自己试一试吧。前文回顾深入学习用Go编写HTTP服务器Web服务器路由十分钟学会用Go编写Web中间件Go Web编程--应用ORM
http://www.zqtcl.cn/news/41516/

相关文章:

  • 河北恒山建设集团网站.net 微信网站开发
  • 征婚网站 女 做茶叶生意义乌外贸
  • 网站后台如何修改密码免费模板下载个人简历
  • 广东智能网站建设质量保障自动升级wordpress失败 —— 请再试一次.
  • 南昌哪里有网站建设建设银行集团网站
  • 免费网站建设平台自己做网站实时监控
  • 台州网站快速优化排名网页设计网站简单静态模板
  • 滁州网站开发czesou要建设一个网站需要什么手续费
  • 高密微网站建设南城网站建设公司
  • 黄冈商城网站制作哪家好怎么优化电脑系统
  • 模板wordpress演示站怎么做泉州企业建站系统
  • 黄冈网站推广软件下载网站外包价格
  • 关岭网站建设图片制作用什么软件
  • 网站如何做查询表单重庆做网站建设团队
  • 扫码员在哪个网站可以做wordpress编辑器怎么添加图片
  • 荆州网站建设厂家前端技术包括哪些
  • 网站建设公司与前端门户网站开发建设技术
  • 网站后台样式模板wordpress cathy主题
  • 做网站论文安卓软件下载用什么好
  • 用vs2008做网站视频教程高密市建设局网站
  • 网站网站制作网站的node.js wordpress
  • 青岛响应式网站开发电商平台运营方案
  • 提供网站推广公司电话公司网站标题优化
  • 网站建设免费制作兰州网页设计最新招聘信息
  • 怎样做网站3天赚100万济南做网站的高端品牌
  • wordpress影视网站ip形象设计排版
  • 网站开发吧杭州市住房和城乡建设部网站
  • 全屏网站模板网站开发定制合同
  • 中国建设会计学网站公司网站建设30元
  • 监理网站廊坊市做网站