首页 > 后端开发 > Golang > 正文

go中跨域自定义验证的问题

WBOY
发布: 2024-02-11 23:18:09
转载
1033人浏览过

go中跨域自定义验证的问题

在Go语言开发中,跨域请求是一个常见的问题。跨域请求是指在浏览器中,通过JavaScript代码向不同域名下的服务器发送请求。由于浏览器的同源策略限制,跨域请求默认是不被允许的。然而,在某些场景下,我们可能需要在跨域请求中进行自定义的验证,以确保请求的安全性和准确性。本文将由php小编西瓜为您介绍如何在Go语言中解决跨域自定义验证的问题,帮助您更好地应对跨域请求的挑战。

问题内容

我正在尝试学习 golang 自定义验证,但遇到了很多麻烦。这是我一直在尝试的代码:

package main
import (
        "reflect"
        "github.com/go-playground/validator/v10"
        "fmt"
)
type TeamMember struct {
        Country string
        Age int
        DropShip bool `validate:"is_eligible"`
}
func CustomValidation(fl validator.FieldLevel) bool {
  /*
    if(DropShip == true) {
       httpresponse = curl https://3rd-party-api.com/?country=<Country>&age=<Age>
       return httpresponse.code == 200
    }
    return false
  */

  b := fl.Parent()
  fmt.Println(reflect.TypeOf(b))
  fmt.Println(reflect.ValueOf(b))
  c := reflect.ValueOf(b).Interface()
  fmt.Println(c.(TeamMember))
  fmt.Println("============")
  return true
}


func main() {
  var validate *validator.Validate
  validate = validator.New(validator.WithRequiredStructEnabled())
  _ = validate.RegisterValidation("is_eligible", CustomValidation)
  teammember := TeamMember{"Canada", 34, true}

  validate.Struct(teammember)
}
登录后复制

您可以在代码注释中看到我尝试的验证逻辑...如果 DropShip 字段为 true,那么我需要将 CountryAge 提交到另一个 API,以查看该团队成员是否符合资格。

问题是我正在努力使用 reflect 库来访问 TeamMember 结构中的 CountryAge 字段。 fmt.Println(c.(TeamMember)) 行使我的程序崩溃。

有人能给我一个如何访问其他 TeamMember 字段的示例吗?或者我的验证方法是否违反了 golang 中验证的惯用方式?

newasp框架2.3.0
newasp框架2.3.0

newasp框架是一个基于 Classic Asp Vbscript Api 框架。全面支持64位,无需修改应用池32位启用,效率更高。 更新日志: 8月2号 - v2.2.9 修复Str.ToString对GetRows二维数组的解析问题 7月26号 - v2.2.8 修复IIS在前端自定义信息头提交下的跨域访问问题 修复路由对跨域OPTIONS发起提交导致的访问问题 修改web.confi

newasp框架2.3.0 5
查看详情 newasp框架2.3.0

解决方法

在这种情况下,最好使用自定义结构级别验证:

package main

import (
    "fmt"

    "github.com/go-playground/validator/v10"
)

type TeamMember struct {
    Country  string
    Age      int
    DropShip bool
}

func TeamMemberStructLevelValidation(sl validator.StructLevel) {
    teamMember := sl.Current().Interface().(TeamMember)

    if teamMember.DropShip {
        // submit the Country and Age to another API to see if this team member is eligible.
        if teamMember.Country == "Canada" && teamMember.Age == 34 {
            sl.ReportError(teamMember.Country, "country", "Country", "is_eligible", "")
            sl.ReportError(teamMember.Age, "age", "Age", "is_eligible", "")
        }
    }
}

func main() {
    validate := validator.New(validator.WithRequiredStructEnabled())
    validate.RegisterStructValidation(TeamMemberStructLevelValidation, TeamMember{})

    teamMember := TeamMember{"Canada", 34, true}
    err := validate.Struct(teamMember)

    fmt.Printf("%+v\n", err)
    // Output:
    //   Key: 'TeamMember.country' Error:Field validation for 'country' failed on the 'is_eligible' tag
    //   Key: 'TeamMember.age' Error:Field validation for 'age' failed on the 'is_eligible' tag
}
登录后复制

另请参阅包提供的示例:https://www.php.cn/link/fe41bb826b6a3cd35fe36744936400b9

以上就是go中跨域自定义验证的问题的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号