现在无论是网站、App、小程序还是移动端H5页面应用,都是采用前端与后端单独部署,相互之间以API接口交互的形式构建而成的。因为在结合可读性、编码数据大小和开发者使用难度上都JSON格式是一个比较好的选择,所以接口的数据格式通常都采用JSON,即前端在发送POSTPUTPATCH请求添加,更改数据时会把数据以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编程--给自己写的服务器添加错误和访问日志

curl post json_Go Web编程--解析JSON请求和生成JSON响应相关推荐

  1. Go Web编程--解析JSON请求和生成JSON响应

    现在无论是网站.App.小程序还是移动端H5页面应用,都是采用前端与后端单独部署,相互之间以API接口交互的形式构建而成的.因为在结合可读性.编码数据大小和开发者使用难度上都JSON格式是一个比较好的 ...

  2. 【项目学习】C++实现高并发服务器——代码学习(二)存储解析HTTP请求报文,创建响应报文

    项目来源:WebServer 上一篇:Reactor高并发模型 本文介绍以下功能的代码实现 利用标准库容器封装char,实现自动增长的缓冲区: 利用正则与状态机解析HTTP请求报文,实现处理静态资源的 ...

  3. Web服务器对客户端请求的响应信息是,图解HTTP权威指南(三)| Web服务器对HTTP请求的处理和响应...

    一.问题 解释Web服务器是如何处理HTTP事务的 二.Web服务器 Web服务器会对HTTP请求进行处理并提供响应.Web服务器请求的七大步骤: 1)接受客户端连接 2)接收请求报文 3)处理请求 ...

  4. Web服务器程序解释请求消息并作出响应

    图6.7展示了服务器程序的工作过程,这个过程不仅限于Web服务器,对于各种服务器程序都是共通的,收发数据的过程也是大同小异的.各种服务器程序的不同点在于图中(b)客户端通信部分的第一行调用read后面 ...

  5. springboot ajax form json 请求方式

    1.form请求的后台代码 1.定义实体 Student package com.bsx.test.entity;import com.bsx.test.constant.Gender; import ...

  6. 【转】Postman系列三:Postman中post接口实战(上传文件、json请求)

    一:接口测试过程中GET请求与POST请求的主要区别 从开发角度我们看get与post的主要区别是: 1.Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据: 2.Get安全性比Pos ...

  7. python生成json文件

    @python生成json文件 python生成json文件 import json control={"bw":100,"delay": "10ms ...

  8. easyui datagrid url不请求请求_Go Web编程--深入学习解析HTTP请求

    之前这个系列的文章一直在讲用Go语言怎么编写HTTP服务器来提供服务,如何给服务器配置路由来匹配请求到对应的处理程序,如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来,以及如何更规范 ...

  9. Go Web编程--深入学习解析HTTP请求

    之前这个系列的文章一直在讲用 Go语言怎么编写HTTP服务器来提供服务,如何给服务器配置路由来匹配请求到对应的处理程序,如何添加中间件把一些通用的处理任务从具体的Handler中解耦出来,以及如何更规 ...

  10. 怎么调用获取被创建的预制体_Go 语言 Web 编程系列—— 获取用户请求数据(上)...

    0.GET/POST 请求数据 在 PHP 中,可以直接通过全局变量 $_GET 和 $_POST 快速获取 GET/POST 请求数据,GET 请求数据主要是 URL 查询字符串中包含的参数,以前面 ...

最新文章

  1. Idea--使用Idea调试设置
  2. 中农王金锋组诚聘微生物组学方向博士后
  3. 宝塔Linux, 反向代理服务器, 开启WSS
  4. Java并发基础:了解无锁CAS就从源码分析 1
  5. Spring 是解析配置类过程详解
  6. html横向排列flex,flex布局示例
  7. 地理素养的核心构成和主要特点
  8. 企业云存储采用率将在2017年飙升
  9. 利用NTFS流文件隐藏
  10. git由于网络原因导致 please make sure you have the correct access rights and the repository exists
  11. Matlab编程基础
  12. DevExpress报表控件v21.2 - 全新的Visual Studio报表设计器
  13. Teambition网盘 批量下载 下载文件夹 递归下载
  14. 老A:抖音爆火的“弹幕互动游戏”是什么?该如何搭建直播间?
  15. Linux安装PHP
  16. 声音四要素:音强、音调、音色和波形包络
  17. 4.CRH寄存器和CRL寄存器
  18. java线程 模拟窗口售票
  19. RK3568全国产化主板---LYM_RK3568G_EVM全新发布
  20. 人际交往中保护自己的30条小技巧!

热门文章

  1. 高中计算机评课,高二信息技术评课记录
  2. ege管理系统_网上人才管理系统方案
  3. kafka消息会不会丢失?为什么?看了这个你就清楚了
  4. 计算机是根据用户名,根据用户名移动计算机账号
  5. 图标圆角角度_教你在 iOS 和 macOS 上获取 App 图标
  6. 【转】nodejs 爬取前端面经并生成词云
  7. element-ui中分页 跳转页面时出现刷新网站的问题
  8. Fiddler 介绍二
  9. OVM 免费虚拟化软件迭代时间调整,提高产品稳定性!
  10. Uniform Server