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

栏目: IT技术 · 发布时间: 4年前

内容简介:现在无论是网站、关于之前也写过两篇关于用

现在无论是网站、 App 、小程序还是移动端 H5 页面应用,都是采用前端与后端单独部署,相互之间以 API 接口交互的形式构建而成的。因为在结合可读性、编码数据大小和开发者使用难度上都 JSON 格式是一个比较好的选择,所以接口的数据格式通常都采用 JSON ,即前端在发送 POSTPUTPATCH 请求添加,更改数据时会把数据以 JSON 格式放到请求的 Body 中。而后端则是所有数据都会以 JSON 格式返回。

关于 JSON 可读性、编码数据大小和开发者使用难度上,因为其可读性不如 XML 结构,但是数据量小,用程序操作起来更方便。对比 Protobuf 来说, Protobuf 编码速度、编码后数据大小比 JSON 都要好,但是用程序操作起来没有 JSON 方便简单,编码后的数据是二进制格式的,易读性完全没有。所以整体来说 JSON 是一个各个方面都不错更容易被所有人接受才被广泛使用的(以上都是个人观点)。

之前也写过两篇关于用 Go 语言解码和编码 JSON 数据的文章

那么针对 Web 编程我们其实只要关注怎么从 HTTP 请求的 Body 中读取到 JSON 数据,以及如何将要返回给客户端的数据以 JSON 格式写入到 HTTP 响应中。

从请求体读取JSON数据

关于这部分内容其实在之前的文章 深入学习解析HTTP请求 里有说过。

我们需要把请求体作为 json.NewDecoder() 的输入流,然后将请求体中携带的 JSON 格式的数据解析到声明的结构体变量中

//handler/parse_json_request
package handler

import (
    "encoding/json"
    "fmt"
    "net/http"
)

type Person struct {
    Name string
    Age  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 handler

import (
    "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 header
    w.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编程--给自己写的服务器添加错误和访问日志

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数字乌托邦

数字乌托邦

尼古拉斯•卡尔 / 姜忠伟 / 中信前沿出版社 / 2018-5 / 69.00

当下,技术与我们的关系变得越来越紧密不可分割,特别是智能手机等设备的出现,带给整个人类社会一场彻底的变革。的确,智能手机上的各种应用程序让我们的工作生活无比便利:社交媒体让我们能够和他人实时保持联络并传输信息,不再受时间、地点的限制;搜索引擎通过精准的算法将我们所需要的信息整合推送至屏幕上,让我们毫不费力就看到自己想要的;地图软件为我们的出行提供了更多路线选择,甚至可以使用语音导航,帮助我们顺利到......一起来看看 《数字乌托邦》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换