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

做外贸找客户的网站dedecms模板安装教程

做外贸找客户的网站,dedecms模板安装教程,医药类网站前置审批,杭州建设网通知公告栏本文介绍 Golang 的 gin 框架接收json数据并解析的2种方法。 起因及排查 某微服务工程,最近测试发现请求超时,由于特殊原因超时较短,如果请求处理耗时超过1秒则认为失败。排查发现,可能是gin接收解析json数据存在耗时&#xff0c…

本文介绍 Golang 的 gin 框架接收json数据并解析的2种方法。

起因及排查

某微服务工程,最近测试发现请求超时,由于特殊原因超时较短,如果请求处理耗时超过1秒则认为失败。排查发现,可能是gin接收解析json数据存在耗时,代码使用ctx.ShouldBindJSON直接解析得到所需结构体,然后通过自实现的FormatJsonStruct函数格式化并输出到日志。该格式函数如下:

func FormatJsonStruct(str interface{}, format bool) (ret string) {ret = ""jsonstr, err := json.Marshal(str)if err != nil {return}if format {var out bytes.Buffer_ = json.Indent(&out, []byte(jsonstr), "", "    ")ret = out.String()} else {ret = string(jsonstr)}return
}

从上述过程看到,先是调用了ShouldBindJSON,再调用了Marshal函数解析成字符串。于是考虑调用ReadAll读取数据,再用Unmarshal解析成结构体,直接输出结构体数据。下面模拟2种不同的解析josn方法。

模拟程序

本节结合代码,简单描述模拟程序。详见文附录。

一般地,在gin中,业务处理函数带有*gin.Context参数,如本文的HandleGinShouldBindJSON,使用ctx.ShouldBindJSON(&request)ctx中带的数据直接转换成目标结构体。

也可以通过ioutil.ReadAll(ctx.Request.Body)先读取客户端来的数据,由于约定为json格式数据,所以可以用json.Unmarshal解析成结构体。

无法哪种方法,其实都很方便,相对而言,前者更便捷。

测试结果

使用curl模拟请求命令,示例如下:

curl http://127.0.0.1:9000/foo -X POST -H "Content-Type:application/json" -d  '{"id":"test_001", "op":"etc", "timestamp":12342134341234, "data":{"name":"foo", "addr":"bar", "code":450481, "age":100}}'curl http://127.0.0.1:9000/bar -X POST -H "Content-Type:application/json" -d  '{"id":"test_001", "op":"etc", "timestamp":12342134341234, "data":{"name":"foo", "addr":"bar", "code":450481, "age":100}}'

服务端输出日志:

=== RUN   TestGin
test of gin
run gin
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.        - using env:   export GIN_MODE=release- using code:  gin.SetMode(gin.ReleaseMode)[GIN-debug] POST   /foo                      --> webdemo/test/gin_test.HandleGinShouldBindJSON (1 handlers)
[GIN-debug] POST   /bar                      --> webdemo/test/gin_test.HandleGinUnmarshal (1 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :9000
ShouldBindJSON: request: #{test_001 etc 12342134341234 {foo bar 450481 100}}
Unmarshal request: #{test_001 etc 12342134341234 {foo bar 450481 100}}
exit status 0xc000013a

小结

就目前测试和修改结果看,本文所述方法并非主因,真正原因待查。

完整代码

/*
结构体
{"id": "test_001","op": "etc","timestamp": 12342134341234,"data": {"name": "foo","addr": "bar","code": 450481,"age": 100}
}curl http://127.0.0.1:9000/foo -X POST -H "Content-Type:application/json" -d  '{"id":"test_001", "op":"etc", "timestamp":12342134341234, "data":{"name":"foo", "addr":"bar", "code":450481, "age":100}}'curl http://127.0.0.1:9000/bar -X POST -H "Content-Type:application/json" -d  '{"id":"test_001", "op":"etc", "timestamp":12342134341234, "data":{"name":"foo", "addr":"bar", "code":450481, "age":100}}'*/package testimport ("encoding/json""fmt""io/ioutil""strings""testing""github.com/gin-gonic/gin"
)var g_port string = "9000"type MyRequest_t struct {Id        string    `json:"id"`Op        string    `json:"op"`Timestamp int       `json:"timestamp"`Data      ReqData_t `json:"data"`
}type ReqData_t struct {Name string `json:"name"`Addr string `json:"addr"`Code int    `json:"code"`Age  int    `json:"age"`
}func routerPost(r *gin.Engine) {r.POST("/foo", HandleGinShouldBindJSON)r.POST("/bar", HandleGinUnmarshal)
}func initGin() {fmt.Println("run gin")router := gin.New()routerPost(router)router.Run(":" + g_port)
}func HandleGinShouldBindJSON(ctx *gin.Context) {var request MyRequest_tvar err errorctxType := ctx.Request.Header.Get("Content-Type")if strings.Contains(ctxType, "application/json") { // 纯 json// 先获取总的jsonif err = ctx.ShouldBindJSON(&request); err != nil {fmt.Printf("ShouldBindJSON failed: %v\n", err)return}fmt.Printf("ShouldBindJSON: request: #%v\n", request)} else {fmt.Println("非json")return}
}func HandleGinUnmarshal(ctx *gin.Context) {var request MyRequest_tvar err errorvar reqbuffer []bytectxType := ctx.Request.Header.Get("Content-Type")if strings.Contains(ctxType, "application/json") { // 纯 jsonreqbuffer, err = ioutil.ReadAll(ctx.Request.Body)if err != nil {fmt.Printf("ReadAll body failed: %v\n", err)return}err = json.Unmarshal(reqbuffer, &request)if err != nil {fmt.Printf("Unmarshal to request failed: %v\n", err)return}fmt.Printf("Unmarshal request: #%v\n", request)} else {fmt.Println("非json")return}
}func TestGin(t *testing.T) {fmt.Println("test of gin")initGin()
}
http://www.yayakq.cn/news/628663/

相关文章:

  • 完全删除wordpress扬中企业网站优化哪家好
  • 网站只做1单生意被罚4万两级违法缙云 网站建设
  • 团购网站怎么推广注册深圳公司有什么好处
  • 织梦网站地图如何做服务网站策划书
  • 哪些网站做的不好用广州站在哪个区
  • 电商网站建设最好的公司上海免费推广网站有哪些
  • 网站建设意义必要性淄博建设企业网站
  • 网站被挂黑后果wordpress返回最新文章
  • 建站优化信息推广东莞网站优化什么方法
  • 我的世界外国做图网站网站管理系统怎么做
  • 莆田网站自助建站品牌网站开发价格
  • 国外商城网站设计浙江网站建设公司名单
  • 做水果网站弄个什么名字自助建站系统下载
  • 长安镇网站建设本周新闻热点10条2021
  • 智慧团建登录入口官方网站ipad做电影网站
  • 学网站开发的软件网站建设项目心得体会
  • 达内网站建设免费推广网站教程
  • 受欢迎的集团网站建设燕郊网站建设哪家好
  • 互联网站有哪些可以做网站的企业
  • 电子商务网站建设与维护ppt定制建站 app建设
  • 视频点播网站开发数据库能上传网站模板
  • html5网站模板移动端东莞网络推广系统
  • 图书商城网站开发的目的VIP视频网站有得做吗
  • 网站模块 带采集产品网站定制
  • 长沙市师德师风建设网站东莞工厂
  • 上海浦东网站设计公司网络营销方案包括哪些主要内容
  • 响应式网站用什么软件做效果免费的个人的网站
  • 上海网站商城建设公司吗番禺市桥做网站公司
  • 高邮网站开发河南政务服务网查二建证书
  • 建立免费公司网站seo短视频入口