curl post json_Go Web编程--解析JSON请求和生成JSON响应
![](/assets/blank.gif)
现在无论是网站、App
、小程序还是移动端H5
页面应用,都是采用前端与后端单独部署,相互之间以API
接口交互的形式构建而成的。因为在结合可读性、编码数据大小和开发者使用难度上都JSON
格式是一个比较好的选择,所以接口的数据格式通常都采用JSON
,即前端在发送POST
,PUT
,PATCH
请求添加,更改数据时会把数据以JSON
格式放到请求的Body
中。而后端则是所有数据都会以JSON
格式返回。
关于JSON
可读性、编码数据大小和开发者使用难度上,因为其可读性不如XML
结构,但是数据量小,用程序操作起来更方便。对比Protobuf
来说,Protobuf
编码速度、编码后数据大小比JSON
都要好,但是用程序操作起来没有JSON
方便简单,编码后的数据是二进制格式的,易读性完全没有。所以整体来说JSON
是一个各个方面都不错更容易被所有人接受才被广泛使用的(以上都是个人观点)。
之前也写过两篇关于用Go
语言解码和编码JSON
数据的文章
- 如何控制Go编码JSON数据时的行为
- 学会用Go解析复杂JSON的思路
那么针对Web
编程我们其实只要关注怎么从HTTP
请求的Body
中读取到JSON
数据,以及如何将要返回给客户端的数据以JSON
格式写入到HTTP
响应中。
从请求体读取JSON数据
关于这部分内容其实在之前的文章深入学习解析HTTP请求里有说过。
我们需要把请求体作为json.NewDecoder()
的输入流,然后将请求体中携带的JSON
格式的数据解析到声明的结构体变量中
//handler/parse_json_request
package handlerimport ("encoding/json""fmt""net/http"
)type Person struct {Name stringAge int
}func DisplayPersonHandler(w http.ResponseWriter, r *http.Request) {var p Person// 将请求体中的 JSON 数据解析到结构体中// 发生错误,返回400 错误码err := json.NewDecoder(r.Body).Decode(&p)if err != nil {http.Error(w, err.Error(), http.StatusBadRequest)return}fmt.Fprintf(w, "Person: %+v", p)
}// router/router.go
indexRouter.HandleFunc("/parse_json_request", handler.ParseJsonRequestHandler)
在命令行里用cURL
命令测试我们的程序:
curl -X POST -d '{"name": "James", "age": 18}' -H "Content-Type: application/json" http://localhost:8000/index/parse_json_request
把JSON数据写入响应
与上面相反,将返回数据以JSON
格式写入响应时,我们调用json.NewEncodeer(w).Encode(&v)
,用响应体作为输入流创建JSON
编码器,然后使用其Encode()
方法将数据编码为JSON
格式并写入响应体。
// handler/write_json_response
package handlerimport ("encoding/json""net/http"
)type User struct {FirstName string `json:"firstname"`LastName string `json:"lastname"`Age int `json:"age"`
}func WriteJsonResponseHandler(w http.ResponseWriter, r *http.Request) {p := User{FirstName: "John",LastName: "Doe",Age: 25,}// Set response headerw.Header().Set("Content-Type", "application/json")err := json.NewEncoder(w).Encode(&p)if err != nil {//... handle error}
}// router/router.go
indexRouter.HandleFunc("/get_json_response", handler.WriteJsonResponseHandler)
重启服务器后在命令行里用cURL
命令测试我们的程序:
curl -X GET http://localhost:8000/index/get_json_response
{"firstname":"John","lastname":"Doe","age":25}
今天的内容很简单,源码已经上传,公众号回复gohttp12获取文中源代码的下载链接。
前文回顾
深入学习用Go编写HTTP服务器
Go Web编程--应用ORM
Go Web 编程--超详细的模板库应用指南
Go Web编程--使用Go语言创建静态文件服务器
Go Web编程--给自己写的服务器添加错误和访问日志
![](/assets/blank.gif)
curl post json_Go Web编程--解析JSON请求和生成JSON响应相关推荐
- Go Web编程--解析JSON请求和生成JSON响应
现在无论是网站.App.小程序还是移动端H5页面应用,都是采用前端与后端单独部署,相互之间以API接口交互的形式构建而成的.因为在结合可读性.编码数据大小和开发者使用难度上都JSON格式是一个比较好的 ...
- 【项目学习】C++实现高并发服务器——代码学习(二)存储解析HTTP请求报文,创建响应报文
项目来源:WebServer 上一篇:Reactor高并发模型 本文介绍以下功能的代码实现 利用标准库容器封装char,实现自动增长的缓冲区: 利用正则与状态机解析HTTP请求报文,实现处理静态资源的 ...
- Web服务器对客户端请求的响应信息是,图解HTTP权威指南(三)| Web服务器对HTTP请求的处理和响应...
一.问题 解释Web服务器是如何处理HTTP事务的 二.Web服务器 Web服务器会对HTTP请求进行处理并提供响应.Web服务器请求的七大步骤: 1)接受客户端连接 2)接收请求报文 3)处理请求 ...
- Web服务器程序解释请求消息并作出响应
图6.7展示了服务器程序的工作过程,这个过程不仅限于Web服务器,对于各种服务器程序都是共通的,收发数据的过程也是大同小异的.各种服务器程序的不同点在于图中(b)客户端通信部分的第一行调用read后面 ...
- springboot ajax form json 请求方式
1.form请求的后台代码 1.定义实体 Student package com.bsx.test.entity;import com.bsx.test.constant.Gender; import ...
- 【转】Postman系列三:Postman中post接口实战(上传文件、json请求)
一:接口测试过程中GET请求与POST请求的主要区别 从开发角度我们看get与post的主要区别是: 1.Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据: 2.Get安全性比Pos ...
- python生成json文件
@python生成json文件 python生成json文件 import json control={"bw":100,"delay": "10ms ...
- easyui datagrid url不请求请求_Go Web编程--深入学习解析HTTP请求
之前这个系列的文章一直在讲用Go语言怎么编写HTTP服务器来提供服务,如何给服务器配置路由来匹配请求到对应的处理程序,如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来,以及如何更规范 ...
- Go Web编程--深入学习解析HTTP请求
之前这个系列的文章一直在讲用 Go语言怎么编写HTTP服务器来提供服务,如何给服务器配置路由来匹配请求到对应的处理程序,如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来,以及如何更规 ...
- 怎么调用获取被创建的预制体_Go 语言 Web 编程系列—— 获取用户请求数据(上)...
0.GET/POST 请求数据 在 PHP 中,可以直接通过全局变量 $_GET 和 $_POST 快速获取 GET/POST 请求数据,GET 请求数据主要是 URL 查询字符串中包含的参数,以前面 ...
最新文章
- Idea--使用Idea调试设置
- 中农王金锋组诚聘微生物组学方向博士后
- 宝塔Linux, 反向代理服务器, 开启WSS
- Java并发基础:了解无锁CAS就从源码分析 1
- Spring 是解析配置类过程详解
- html横向排列flex,flex布局示例
- 地理素养的核心构成和主要特点
- 企业云存储采用率将在2017年飙升
- 利用NTFS流文件隐藏
- git由于网络原因导致 please make sure you have the correct access rights and the repository exists
- Matlab编程基础
- DevExpress报表控件v21.2 - 全新的Visual Studio报表设计器
- Teambition网盘 批量下载 下载文件夹 递归下载
- 老A:抖音爆火的“弹幕互动游戏”是什么?该如何搭建直播间?
- Linux安装PHP
- 声音四要素:音强、音调、音色和波形包络
- 4.CRH寄存器和CRL寄存器
- java线程 模拟窗口售票
- RK3568全国产化主板---LYM_RK3568G_EVM全新发布
- 人际交往中保护自己的30条小技巧!