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

网站页面优化分析怎样做的英文网站

网站页面优化分析,怎样做的英文网站,网站怎么做好 优帮云,网络营销方法的种类大家好#xff0c;针对Go语言 net/http 标准库#xff0c;将梳理的相关知识点分享给大家~~ 围绕 net/http 标准库相关知识点还有许多章节#xff0c;请大家多多关注。 文章中代码案例只有关键片段#xff0c;完整代码请查看github仓库#xff1a;https://github.com/hltfa…大家好针对Go语言 net/http 标准库将梳理的相关知识点分享给大家~~ 围绕 net/http 标准库相关知识点还有许多章节请大家多多关注。 文章中代码案例只有关键片段完整代码请查看github仓库https://github.com/hltfaith/go-example/tree/main/net-http 本章节案例请大家以 go1.16 版本以上进行参考。 net/http标准库系列文章 Golang net/http标准库常用请求方法(一)Golang net/http标准库常用方法(二)Golang net/http标准库常用方法(三) 本节内容 ProxyFromEnvironment() 函数ProxyURL() 函数Serve() 函数ServeContent() 函数DetectContentType() 函数MaxBytesReader() 函数 ProxyFromEnvironment() ProxyFromEnvironment()函数用于读取所在环境的环境变量返回代理地址。比如环境变量HTTP_PROXY、HTTPS_PROXY和NO_PROXY如果在 NO_PROXY 排除的地址则不进行代理。 代理地址格式可以是完整的URL也可以是host[:port]。支持 HTTP、HTTPS、SOCKS5代理。 如果环境中未定义代理或者NO_PROXY定义的给定请求不应使用代理则返回nil URL和nil错误。如果 req.URL.Host 地址为 localhost 加或没加端口都会返回 nil 错误。 函数原型 func ProxyFromEnvironment(req *Request) (*url.URL, error)函数使用 proxyfromenvironment.go func main() {os.Setenv(HTTP_PROXY, http://127.0.0.1:12345)req, err : http.NewRequest(GET, http://example.com, nil)if err ! nil {panic(err)}url, err : http.ProxyFromEnvironment(req)if err ! nil {panic(err)}fmt.Println(url) }案例中 http.ProxyFromEnvironment(req) 仅会把读取环境变量 HTTP_PROXY 的代理地址在我们使用 http.NewRequest() 请求时不会使用代理请求。 下面通过 ProxyURL() 函数案例发起代理请求。 ProxyURL() ProxyURL() 作用是返回一个代理函数主要用于在 Transport{} 类型中其参数是代理地址。 函数原型 func ProxyURL(fixedURL *url.URL) func(*Request) (*url.URL, error)举例使用代理发送 HTTP 请求。 proxyurl.go func main() {url, err : url.Parse(http://188.68.176.2:8080)if err ! nil {panic(err)}client : http.Client{Transport: http.Transport{Proxy: http.ProxyURL(url),TLSClientConfig: tls.Config{InsecureSkipVerify: true},},}res, err : client.Get(http://baidu.com)if err ! nil {panic(err)}b, _ : httputil.DumpRequest(res.Request, false)fmt.Println(string(b)) }上述例子中 将代理函数ProxyURL(url)通过Transport{}类型封装好后向目标服务发送GET请求。 Client{}、Transport{}类型后续文章将详细讲解。 注代理地址可以参考 https://www.kuaidaili.com/free/fps/ 用于测试使用。 上面案例也可以将 http.ProxyURL() 函数改成 ProxyFromEnvironment() 用环境变量的方式。 proxyurl2.go func main() {url, err : url.Parse(http://google.com)if err ! nil {panic(err)}os.Setenv(HTTP_PROXY, http://127.0.0.1:7890)client : http.Client{Transport: http.Transport{Proxy: http.ProxyFromEnvironment,TLSClientConfig: tls.Config{InsecureSkipVerify: true}, // 跳过https},}req : http.Request{Method: GET,URL: url,Header: map[string][]string{Proxy-Connection: {keep-alive},},}res, err : client.Do(req)if err ! nil {panic(err)}defer res.Body.Close() }这里是通过我本地环境的代理VPN所监听的端口 http://127.0.0.1:7890 下面我通过抓包大家可以看到执行代理请求的时候源端口 50130是我们请求端访问的谷歌网站目的端已经变成了 http://127.0.0.1:7890 地址也是我们的代理端后面的响应也是由代理端给我们请求回应数据包。 Serve() Serve() 函数接收监听 HTTP 连接请求为每个连接创建一个新goroutine。goroutine读取请求然后调用处理程序来回复它们。 官方建议 handler 为 nil类型 则默认使用 DefaultServerMux 全局锁机制。 可以参考上篇文章中有所介绍 只有当 Listener 返回tls的时候才支持HTTP/2协议。 Serve() 函数返回非 nil 的报错。 函数原型 func Serve(l net.Listener, handler Handler) errorServe()函数实际上是调用的 Server{} 类型中封装的一个方法。 func Serve(l net.Listener, handler Handler) error {srv : Server{Handler: handler}return srv.Serve(l) }例如上篇文章中介绍的 ListenAndServe()、ListenAndServeTLS() 方法它们最终执行都是 Server{}类型中的 Serve() 方法。 函数使用 serve.go func main() {ln, err : net.Listen(tcp, :8080)if err ! nil {panic(err)}http.HandleFunc(/, func(w http.ResponseWriter, req *http.Request) {io.WriteString(w, 帽儿山的枪手!\n)})log.Panicln(http.Serve(ln, nil)) }ServeContent() ServeContent() 函数使用ReadSeeker所读取的内容回复给用户请求。 ServeContent比io.Copy更好的是他能够合适的处理一批请求设置MIME类型并且能够处理文件是否修改的请求。 如果响应的内容类型头没有设置,该函数首先会尝试从文件的文件扩展名推断文件类型。 如果推断不出来则会读取文件的第一个块并传送给DetectContentType来检测类型。 文件名称也可以不使用。 如果文字名称为空则服务器不会传送给响应。 如果修改时间不为0ServeContent会把它放在服务器响应的Last-Modified头里面。 如果客户端请求中包含了If-Modified-Since头ServeContent会使用modtime来判断是否把内容传给客户端。 content的Seek方法必须能够工作。 ServeContent通过定位到文件结尾来确定文件大小。 *os.File中实现了io.ReadSeeker接口。 函数原型 func ServeContent(w ResponseWriter, req *Request, name string, modtime time.Time, content io.ReadSeeker)参数 w 服务器响应参数 req 客户端请求参数 name 文件名称参数 modtime 文件的修改时间参数 content 文件的内容必须实现 io.ReadSeeker 这个接口中的方法 下面案例使用 ServeContent() 函数实现文件下载功能。 servecontent.go func main() {http.HandleFunc(/download, func(w http.ResponseWriter, r *http.Request) {file : servecontent.gofileBytes, err : ioutil.ReadFile(file)if err ! nil {panic(err)}mime : http.DetectContentType(fileBytes)fileSize : len(string(fileBytes))w.Header().Set(Content-Type, mime)w.Header().Set(Content-Disposition, attachment; filenamefile)w.Header().Set(Content-Length, strconv.Itoa(fileSize))http.ServeContent(w, r, file, time.Now(), bytes.NewReader(fileBytes))})log.Fatal(http.ListenAndServe(:8080, nil)) }首先通过 DetectContentType()函数获取了文件的 MIME 类型然后将文件转换为 Byte 类型传入 ServeContent() 函数中实现下载功能。 结合上篇文章中介绍的 ServeFile()函数它实现起来更简洁仅需要一行代码实现文件下载但前提需要知道文件上下文路径。 ServeContent() 函数更适用于当你只能拿到 byte[] 数据时可以优先使用它。 DetectContentType() DetectContentType() 该函数实现了一个算法用来检测指定的数据是否符合该标准http://mimesniff.spec.whatwg.org 。 最多需要数据的前512个字节DetectContentType()会返回一个有效的MIME类型。 如果它不能够识别数据将会返回application/octet-stream。 函数原型 func DetectContentType(data []byte) string函数使用 func main() {// image/pngfmt.Println(http.DetectContentType([]byte(\x89PNG\x0D\x0A\x1A\x0A)))// image/jpegfmt.Println(http.DetectContentType([]byte(\xFF\xD8\xFF))) }注一些类型的识别可以参考go源码测试用例。 MaxBytesReader() MaxBytesReader() 函数用来保护服务器端以避免客户端偶然或者恶意发送的长数据请求导致的服务端资源的浪费。 MaxBytesReader()跟io.LimitReader函数很像。但是它被设计来设置接收的请求体的最大大小。 跟io.LimitReader不同MaxBytesReader()的返回值是一个ReadCloser当读取超过限制时会返回non-nil错误。 并且当它调用关闭方法的时候会把潜在的读取者函数/进程也关闭掉。 函数原型 func MaxBytesReader(w ResponseWriter, r io.ReadCloser, n int64) io.ReadCloser参数 w服务器响应参数 r可以指向 req.Body参数 n限制大小 案例限制客户端上传数据为10个字节。 maxbytesreader.go func main() {http.HandleFunc(/, func(w http.ResponseWriter, r *http.Request) {r.Body http.MaxBytesReader(w, r.Body, 10)_, err : io.Copy(ioutil.Discard, r.Body)if err ! nil {panic(err)}io.WriteString(w, 200\n)})log.Fatal(http.ListenAndServe(:8080, nil)) }下面我们通过 curl 命令模拟客户端请求 其中body内容已经超出了10个字节 roothc:~# curl --location --request POST http://127.0.0.1:8080 \ --header Content-Type: application/json \ --data-raw {t: 1234567890 }请求完成后看到服务端已经提示 请求Body过大。 技术文章持续更新请大家多多关注呀~~ 搜索微信公众号关注我【 帽儿山的枪手 】
http://www.zqtcl.cn/news/89538/

相关文章:

  • 成功的企业网站案例做网站给女朋友
  • 赤水市建设局官方网站刷leetcode对网站开发有用吗
  • 怎么使用织梦做下载网站电子商务和网站建设区别
  • 介绍自己做衣服的网站莱芜最新钟点工招聘
  • 淘客网站建设教程吉林企业网站模板建站哪个好
  • 网站域名备案地址国外平面设计分享网站有哪些
  • 网站的开发技术官方网站 建设情况汇报
  • 普通电脑可以做网站服务器吗常见的域名注册网站
  • 收费下载的wordpress网站游戏公司
  • 做网站送企业邮箱网站建设注意哪些事项
  • 福州网站建设哪里有网站建设方案
  • 企业网站备案要多少钱网站建设 从入门到精通pdf
  • 网站做我女朋友电商平台网站定制
  • 杭州网站建设出名吕梁营销型网站建设费用
  • 广东手机网站建设哪家专业吉林大学建设工程学院网站
  • 软文广告成功案例湖南网站seo优化
  • 建公司网站要多少钱易班网站建设基础
  • 网站建设技术进行开发分分彩做号网站
  • 一个网站如何赚钱alexa排名与什么有关系
  • 企业建设网站应如何申请中国制造加工网官网
  • 企业网站建设cms系统广源建设集团有限公司网站
  • 网站建设企业免费咨询石家庄楼盘最新消息
  • 一个网站如何做双语网站域名 空间申请表
  • 自建免费网站哪个好下载全网搜
  • 北京网站改版多少钱保护环境做网站素材
  • 网站建设还有需求么做网站 聊城
  • 专业网站优化哪家好昆山有建设网站的吗
  • 网站建设流程六个步骤kencms内容管理系统
  • 拖拽建站平台水土保持与生态建设网站
  • seo网站改版如何建立和设计公司的网站