gin参数解析相关方法

姊妹篇:

gin路由相关方法

gin数据返回相关方法


get方法用query和querydefault

post方法,用c.Bind的话,需要是json格式,否则解析不了

form-data和x-www-form-urlencoded 不行



番外: 权限认证

1
2
3
s.http.Use(gin.BasicAuth(gin.Accounts{
s.conf.BasicUser: s.conf.BasicPasswd,
}))

gin.BasicAuth用来保护gin路由,仅允许授权用户访问。

gin.BasicAuth接收gin.Accounts参数,Accounts是一个map,key是用户名,value是密码。

代码中的意思是:

  1. 使用gin.BasicAuth中间件

  2. 设置用户名为s.conf.BasicUser,密码为s.conf.BasicPasswd

  3. 只有使用这个用户名和密码登录的请求,才能通过这个BasicAuth中间件,访问后续路由处理函数。

使用BasicAuth的主要步骤是:

  1. 定义用户名密码,如:

    1
    2
    3
    accounts := gin.Accounts{
    "admin": "password",
    }
  2. 在路由组使用BasicAuth中间件:

    1
    2
    3
    router := gin.Default()
    authorized := router.Group("/authorized")
    authorized.Use(gin.BasicAuth(accounts))
  3. 后续路由都受到这个BasicAuth中间件保护

    1
    authorized.POST("/login", loginHandler)
  4. 请求需要带上Authorization头,值为Base64编码后的”用户名:密码”

    1
    Authorization: Basic YWRtaW46cGFzc3dvcmQ=
  5. 匹配上用户名密码后才能访问处理函数

所以通过gin.BasicAuth可以很方便的为路由组添加HTTP基本身份验证功能。


注意中间有那个冒号


go中的base64:

1
2
3
4
5
6
7
8
9
package main

import "encoding/base64"

func main() {
data := "hello world"
encoded := base64.StdEncoding.EncodeToString([]byte(data))
fmt.Println(encoded)
}

番外:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
func (s *Service) checkdns(domain string) (bool, error) {
msg := &dns.Msg{}
msg.SetQuestion(dns.Fqdn(domain), dns.TypeCNAME)
ctx, cf := context.WithTimeout(context.Background(), time.Second*10)
defer cf()

r, err := dns.ExchangeContext(ctx, msg, DNSUpstream)
if err != nil {
return false, err
}
if r.Rcode != dns.RcodeSuccess {
return false, errors.New("dns response not ok")
}

for _, ans := range r.Answer {
if cname, ok := ans.(*dns.CNAME); ok {
if cname.Target == s.conf.MyDomain {
return true, nil
}
}
}

return false, errors.New("cname to here not found")
}

这段代码是一个Go语言函数,用于检查给定域名的DNS记录是否存在特定的CNAME记录。

函数名为checkdns,它是定义在Service结构体上的一个方法。该方法接收一个domain参数,表示要检查的域名。函数返回两个值:一个布尔值和一个错误值。

函数的主要功能是通过向指定的DNS服务器发送DNS查询请求,检查域名的CNAME记录。它使用了github.com/miekg/dns包来进行DNS操作。

代码的主要逻辑如下:

  1. 创建一个空的dns.Msg对象,用于构造DNS查询消息。
  2. 使用msg.SetQuestion方法设置查询问题,将域名转换为全限定域名(Fully Qualified Domain Name,FQDN),查询类型为CNAME。
  3. 使用context.WithTimeout方法创建一个带有超时的上下文对象,超时时间为10秒。
  4. 调用dns.ExchangeContext方法发送DNS查询请求并获取响应。
  5. 检查是否有错误发生,如果有错误则返回false和该错误。
  6. 检查DNS响应的Rcode字段,如果不等于dns.RcodeSuccess,表示DNS响应不正常,返回false和一个自定义的错误信息。
  7. 遍历DNS响应的Answer字段,对每个回答进行检查。
  8. 如果回答是一个CNAME记录且目标与Service结构体的conf.MyDomain字段相匹配,则表示找到了符合条件的CNAME记录,返回truenil
  9. 如果没有找到符合条件的CNAME记录,则返回false和一个自定义的错误信息。

总体来说,这段代码用于检查给定域名的CNAME记录是否存在,并判断目标是否与Service结构体中的配置相匹配。


最终rongyi老哥的代码会生成一个nginx的conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
root@VM-0-61-ubuntu:/etc/nginx/conf.d# cat cui.wode.tech.conf 

server {
listen 443 ssl;
server_name cui.wode.tech;

ssi on;
ssi_silent_errors on;
ssl_protocols TLSv1.2 TLSv1.3;

ssl_certificate /data/lego/.lego/certificates/cui.wode.tech.pem;
ssl_certificate_key /data/lego/.lego/certificates/cui.wode.tech.key;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header X-Content-Type-Options "nosniff";
add_header X-Frame-Options SAMEORIGIN;
add_header X-XSS-Protection "1; mode=block";
client_max_body_size 20m;
access_log /data/log/nginx/cui.wode.tech.log;

location / {
try_files $uri $uri/ /index.html;
# TODO: change real server
root /data/taskonsaas;
index index.html index.htm;
}
}



server {
listen 80;
server_name cui.wode.tech;
client_max_body_size 50m;

return 301 https://cui.wode.tech;
}

文章目录