Golang如何解析post请求中的json字符串

liuzhen007 等级 597 0 0
标签: postgolangGolang

目录

问题

解决

问题

使用Golang开发服务器,最常用的使用场景之一就是处理各种http请求。那么我们如何使用Golang解析Post请求中的Json字符串呢?今天我们就来通过一个实例了解一下。

解决

首先,我们需要定义好对应的消息结构,也就是前端请求服务器的API接口。定义接口的话推荐使用工具YAPI编写,支持预览、编辑、导出,非常方便。自己平时用的比较多。

Golang如何解析post请求中的json字符串

比如,定义如下接口:

  type recordConfig struct {

    StreamPath string `json:"streamPath"`

    Append bool `json:"append"`

    Protocol string `json:"protocol"`

    Url string `json:"url"`

}

接口完成后,接下来我们开始处理http的请求。对于http请求,我们知道post请求的参数都是放在body中,我们需要先获取body,再解析其中的参数。

通过代码,我们来看一下如何读取对应请求的body信息。

代码如下:

body, err := ioutil.ReadAll(r.Body)

defer r.Body.Close()

if err != nil {

    return

}

点击并拖拽以移动最后,解析Json字符串为Json对象。 注意:这里有两种方式,都是非常方便的,具体方式请自选。

但是,这两种方法都需要首先入库json库,代码:

import (   
    "encoding/json"
)

方法一、利用Unmarshal()方法

Unmarshal是json库的一个内部方法,它的第一个参数是json字符串,第二个参数是接受json解析的数据结构。 注意:第二个参数必须是指针,否则无法接收解析的数据。

Unmarshal方法的源码:

// When unmarshaling quoted strings, invalid UTF-8 or
// invalid UTF-16 surrogate pairs are not treated as an error.
// Instead, they are replaced by the Unicode replacement
// character U+FFFD.
func Unmarshal(data []byte, v interface{}) error {      
  var d decodeState    
  err := checkValid(data, &d.scan)    
  if err != nil {        
    return err    
  }    
  d.init(data)    
  return d.unmarshal(v)
}

通过源码我们知道,Unmarshal方法处理的参数1是一个字节数组。这一点非常好,因为 body 中就是字节数组的形式,所以我们可以直接使用。

最后,我们给出对应的代码实例:

var conf recordConfig

err := json.Unmarshal(body, &conf)

接下来,我们看方法二。点击并拖拽以移动

方法二、利用NewDecoder组合方法

首先,我们看一下源码:

// NewDecoder returns a new decoder that reads from r.
// The decoder introduces its own buffering and may
// read data from r beyond the JSON values requested.
func NewDecoder(r io.Reader) *Decoder {    
  return &Decoder{r: r}
}

我们知道,NewDecoder方法只需要一个参数,类型是io.Reader,而 r.Body 的类型正好符合,所以我们不用像方法一那样,需要用下面的方法进行转换。

ioutil.ReadAll(r.Body)

最后,给出对应的代码实例:

var conf recordConfig

err := json.NewDecoder(r.Body).Decode(&conf)

点击并拖拽以移动至此,我们就可以使用 conf.StreamPath 获取流路径信息了。然后,开始服务器的后续工作。

收藏
评论区

相关推荐

关于Golang的那些事(一) -- Node.js和Golang对比
之前一直用Node.js作为开发语言,用了差不多4年的Node.js,涉及前端和后端,最近看到Golang这个新兴之秀挺火的,于是想探究探究一下这门语言,对比了一下他们的Github repo,截止现在Node.js的repo有72.5K星, issue数量是859个,Golang的repo有75.7K星,issue数量是5K个。从趋势来看,Golang来势
golang 中神奇的 slice
声明:本文仅限于简书发布,其他第三方网站均为盗版,原文地址: golang 中神奇的 slice(https://links.jianshu.com/go?tohttps%3A%2F%2Fliqiang.io%2Fpost%2Fimagesliceingolang) 在 golang 中,似乎人们都不太喜欢使用 Linked List,甚至于原
godoc 命令和 golang 代码文档管理
介绍 godoc 是 golang 自带的文档查看器,更多的提供部署服务 go doc 和 godoc 在 golang 1.13 被移除了,可以自行安装 golang.org go1.13 godoc(https://links.jianshu.com/go?tohttps%3A%2F%2Fgolang.org%2Fdoc%2Fg
Mac安装Golang和vscode
Mac第一次安装golang和vscode一起使用,遇到了不少的坑,下面介绍一下正确的安装方式。 1、使用brew安装Golang 如果不知道brew是什么,或怎么安装请看这里 brew官网(https://brew.sh/index_zhcn) brew install golang 安装完成后可以使用
为什么GOPROXY对Golang开发如此重要
为什么GOPROXY对Golang开发如此重要 引言 从Go 1.13开始,Go Module作为Golang中的标准包管理器,在安装时自动启用,并附带一个默认的GOPROXY。 但是对于其他的GOPROXY选项,比如JFrog GoCenter,以及你自己的Go Module包,你需要在公众视野中保持安全,你应该选择什么样的配置? 你怎样才能
【Golang】GoWeb框架之Gin-简明教程
Gin 简介 Gin is a HTTP web framework written in Go (Golang). It features a
Golang中常用的字符串操作
Golang中常用的字符串操作 一、标准库相关的Package go import( "strings" ) 二、常用字符串操作 1. 判断是否为空字符串 1.1 使用“”进行判断 思路:直接判断是否等于""空字符串,由于Golang中字符串不能为 nil,且为值类型,所以直接与空字符串比较即可。 举例: go
golang 分析调试高阶技巧
layout: post title: “golang 调试高阶技巧” date: 2020603 1:44:09 0800 categories: golang GC 垃圾回收 golang 高阶调试 Golang tools nm compile
golang包循环引用的几种解决方案
golang包循环引用的几种解决方案 发表于2020年11月2日2020年11月3日(https://libuba.com/2020/11/02/golang%e5%8c%85%e5%be%aa%e7%8e%af%e5%bc%95%e7%94%a8%e7%9a%84%e5%87%a0%e7%a7%8d%e8%a7%
问题 first path segment in URL cannot contain colon 的解决方案
目录问题解决 问题使用Golang开发流媒体服务器处理Post请求时,遇到了这个报错信息:2020/12/14 07:21:01 callback post failed2020/12/14 07:21:01 error::8080/api/callback: first path segment in URL cannot contain col
Golang如何解析post请求中的json字符串
目录问题解决 问题使用Golang开发服务器,最常用的使用场景之一就是处理各种http请求。那么我们如何使用Golang解析Post请求中的Json字符串呢?今天我们就来通过一个实例了解一下。 解决首先,我们需要定义好对应的消息结构,也就是前端请求服务器的API接口。定义接口的话推荐使用工具YAPI编写,支持预
GO开发[一]:golang语言初探
一.Golang的安装 1.https://dl.gocn.io/ (国内下载地址) (https://imghelloworld.osscnbeijing.aliyuncs.com/658c5d13c377
Android如何解析json字符串
前言上一篇文章介绍了服务器用Golang如何解析json字符串,今天我们来看看Android客户端是如何解析json字符串的。 正文Golang如何解析post请求中的json字符串(https://www.helloworld.net/p/O917HGeiALU2D)使用java语句如何正确解析json字符串呢?举一个例子,假如我们想从rtc_i
golang - DES加密ECB(模式)
Java默认DES算法使用DES/ECB/PKCS5Padding,而golang认为这种方式是不安全的,所以故意没有提供这种加密方式,那如果我们还是要用到怎么办?下面贴上golang版的DES ECB加密解密代码(默认对密文做了base64处理)。
go get下载包失败问题
关于我由于某些不可抗力的原因,国内使用go get命令安装包时会经常会出现timeout的问题。本文介绍几个常用的解决办法。 从github克隆golang在github上建立了一个镜像库,如https://github.com/golang/net就对应是 https://golang.org/x/net的镜像库。 要下载golang.org/x/net包