当前位置: 首页 > 科技观察

GolangNet-Http的小技巧

时间:2023-03-13 03:50:43 科技观察

以后会开个看板,摸鱼速递,快速记录这几周开发中的小技巧,也算是错题集。1、将cookie植入开发环境localhost:3000。前端使用CreateReactApp脚手架,默认以localhost:3000端口启动;后端使用golang-gin框架,启动8034端口,登录模块使用sso,前后端分离,后端需要向前端写入认证cookiec.SetSameSite(http.SameSiteLaxMode)c.SetCookie("userInfo",userInfoMapString,60*60*12,"/",cfg.CookieDomain,false,false)c.SetCookie("access_token",accessToken.(string),60*60*12,"/",cfg.CookieDomain,false,false)如果你在种cookie的时候设置了domain=localhost:3000,实际你会发现cookie种为domain=localhost①golang给出日志提示:2023/01/1219:10:48net/http:无效的Cookie.Domain“localhost:3000”;dropingdomain属性,cookiedomain属性被丢弃:②浏览器识别cookie没有domain,属性值重置为当前页面。该cookie是一个HostOnlycookie,只有host和cookie的domain完全相等,后续请求才能携带这个cookie。React配置后端地址,应该配置为localhost:8034,而不是127.0.0.1:8034经过此战:Origin(起源)是由协议、主机名(域名域)和端口组成的部分URL?这次出现的问题是cookie的两个关键属性:cookie域:cookie种在哪个域名下?cookiesamesite:哪些资源在请求时可以携带这个cookie?2.httpclienttimeout报错经验golangnet/httphttpclientTimeout:Timeout为这个Client发出的请求指定了一个时间限制。超时包括连接时间、任何重定向和读取响应正文。计时器在Get、Head、Post或Do返回后继续运行,并将中断Response.Body.HttpClient的读取。超时包括连接、重定向(如果有)、从ResponseBody读取的时间,内置计时器将继续在Get、Head、Post、Do方法之后运行,并且具有中断读取Response.Body的能力。如果上游服务器处理超时(upstream_response_time>clientsettimeout),它会返回contextdeadlineexceeded(Client.Timeoutexceededwhilewaitingheaders)。如果客户端使用io.ReadAll读取body超时,会返回contextdeadlineexceeded(Client.Timeoutorcontextcancellationwhilereadingbody)。3.url区分大小写如果你使用net/http搭建的http服务器,默认请求url路径区分大小写:s.mux.HandleFunc("/leader",func(whttp.ResponseWriter,r*http.Request){}s.mux.HandleFunc("/LEADER",func(whttp.ResponseWriter,r*http.Request){}以上会识别为不同的路由路径。探索源码:ServeMux使用map[string]muxEntry存储路由的Hash表,这个和aspnetcore的路由行为不同,/hello,/HELLO会打到下面的路由app.UseEndpoints(endpoints=>{endpoints.MapGet("/hello",asynccontext=>{awaitcontext.Response.WriteAsync("Hello!");});}w3c官方推荐:URLcase-sensitive.URLs一般情况下是区分大小写的(机器名除外)。可能有URL或URL的一部分,大小写无关紧要,但识别这些可能并不容易。用户应始终考虑URL区分大小写。一般的想法是:除了域名主机名不区分大小写,因此URL通常被认为是区分大小写的。Stackoverflow有更清晰的描述:方案和主机不区分大小写,通常以小写形式提供;所有其他组件都以区分大小写的方式进行比较。4.Golangstatuscode作为header,一直很费解。在Go语言中,客户端请求信息被封装到Request对象中,但是发送给客户端的响应并不是一个Response对象,而是一个ResponseWriter:funcHome(whttp.ResponseWriter,r*http.Request){io.WriteString(w,"Welcometomyblogsite")}ResponseWriter是处理器用来创建HTTP响应的接口,其源码结构如下:typeResponseWriterinterface{//用于设置/获取所有的响应头信息Header()Header//用于向响应实体写入数据Write([]byte)(int,error)//用于设置响应状态码WriteHeader(statusCodeint)}WriteHeader的方法名有点误导,在实际上它不是用来设置响应头的,这个方法支持传入一个整数数据来表示响应状态码,如果不调用这个方法,默认的响应状态码是200OK。在fasthttp中,设置请求谓词:req.Header.SetMethod("POST"),我也对使用谓词作为header的行为深信不疑。状态码只能设置一次,如果多次设置状态码,前者优先。例如,尝试如下:http.NotFound(w,r)#WriteHeader(404)将被调用;Write()写入bodyw.WriteHeader(http.StatusInternalServerError)会产生报警:2023/01/0619:19:43http:superfluousresponse.WriteHeadercallfrommain.ProxyHandler(proxy.go:25),同时产生404状态码。您可以通过以下方式明确定义状态码和bodyw.WriteHeader(http.StatusInternalServerError)fmt.Fprintln(w,"404pagenotfound")