详解Go语言中Get/Post请求测试

目录
  • gin安装
  • Get请求测试
  • Post请求测试

基础语法差不多了,需要开始实践到一下项目,先来web框架gin吧,做一个后端web服务。

在把项目搭建起来的过程中,我也要结合实际的工作经验,补充一些项目结构、开发组件上的理解。

项目地址:github地址

gin安装

先将gin安装一下,安装依赖go语言还是比较方便的。

在安装之前先配置一下goproxy。

命令如下:

go env -w GO111MODULE=on
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/   //阿里代理
go env -w GOPROXY=https://goproxy.cn   //七牛云代理

安装一下gin,命令如下:

go get github.com/gin-gonic/gin

Get请求测试

实现一个web服务还是比较简单的,创建一个router,绑定路由规则即可。先测试几个Get请求。

样例代码如下:

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	router := gin.Default()
	router.GET("/", func(context *gin.Context) {
		context.String(http.StatusOK, "hello world")
	})

	router.GET("/test/:name", func(context *gin.Context) {
		name := context.Param("name")
		context.String(http.StatusOK, "check param %s", name)
	})

	router.GET("/test1", func(context *gin.Context) {
		name := context.DefaultQuery("name", "张三")
		gender := context.Query("gender")
		context.String(http.StatusOK, "他叫%s,性别:%s", name, gender)
	})

	router.Run(":8080")
}

执行结果

[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] GET    /                         --> main.main.func1 (3 handlers)
[GIN-debug] GET    /test/:name               --> main.main.func2 (3 handlers)
[GIN-debug] GET    /test1                    --> main.main.func3 (3 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 :8080

[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend yo
u 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 :8080

测试一下,这里我是用的接口测试工具为ApiPost

注意

1、在使用context.DefaultQuery方法的时候,可以提供一个默认值。

2、除了可以使用":"来获取路径参数外,可以使用"*",可以匹配更多规则。我个人感觉我不会这么用get请求参数。

Post请求测试

Post请求是在项目中使用的比较多的,而且不管是使用form获取参数还是body,都十分常见。

同时返回的数据也不可能使用一行字符串,实际项目中还是使用json格式居多。

所以下面我使用form参数和body参数实现了一下post测试接口。

完成代码如下

package main

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"io/ioutil"
	"net/http"
)

type Result struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

//反序列化为结构体对象
func parseJson(a string) Result {
	fmt.Printf("原始字符串: %s\n", a)
	var c Result
	if err := json.Unmarshal([]byte(a), &c); err != nil {
		fmt.Println("Error =", err)
		return c
	}
	return c
}

func main() {
	router := gin.Default()
	router.GET("/", func(context *gin.Context) {
		context.String(http.StatusOK, "hello world")
	})

	router.GET("/test/:name", func(context *gin.Context) {
		name := context.Param("name")
		context.String(http.StatusOK, "check param %s", name)
	})

	router.GET("/test1", func(context *gin.Context) {
		name := context.DefaultQuery("name", "张三")
		gender := context.Query("gender")
		context.String(http.StatusOK, "他叫%s,性别:%s", name, gender)
	})

	router.POST("/testPost", func(context *gin.Context) {
		name := context.PostForm("name")
		nick := context.DefaultPostForm("nick", "leo")
		context.JSON(http.StatusOK, gin.H{
			"status": gin.H{
				"code":    http.StatusOK,
				"success": true,
			},
			"name": name,
			"nick": nick,
		})
	})

	router.POST("/testPost2", func(context *gin.Context) {
		data, _ := ioutil.ReadAll(context.Request.Body)
		fmt.Println(string(data))
		context.JSON(http.StatusOK, gin.H{
			"code": http.StatusOK,
			"data": parseJson(string(data)),
		})
	})

	router.Run(":8080")
}

测试一下testPost和testPost2接口

注意

1、使用context.DefaultPostForm方法可以提供一个默认值。

2、可以使用gin.H方法构造json结构返回。

3、将获得打参数反序列化为结构体,这部分的代码使用到之前讲json解析的笔记。

到此这篇关于详解Go语言中Get/Post请求测试的文章就介绍到这了,更多相关Go语言 Get Post请求内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • GO接收GET/POST参数及发送GET/POST请求的实例详解

    Golang: 接收GET和POST参数 GET 和 POST 是我们最常用的两种请求方式,今天讲一讲如何在 golang 服务中,正确接收这两种请求的参数信息. 处理GET请求 1.1 接收GET请求 //接收GET请求 func Get(writer http.ResponseWriter , request *http.Request) { query := request.URL.Query() // 第一种方式 // id := query["id"][0] // 第二种方式

  • Go语言Web编程实现Get和Post请求发送与解析的方法详解

    本文实例讲述了Go语言Web编程实现Get和Post请求发送与解析的方法.分享给大家供大家参考,具体如下: 这是一篇入门文章,通过一个简单的例子介绍Golang的Web编程主要用到的技术. 文章结构包括: 1. Client-Get 请求 2. Client-Post 请求 3. Server 处理 Get 和 Post 数据 在数据的封装中,我们部分采用了json,因而本文也涉及到Golang中json的编码和解码. 一.Client-Get 复制代码 代码如下: package main i

  • Go语言中利用http发起Get和Post请求的方法示例

    关于 HTTP 协议 HTTP(即超文本传输协议)是现代网络中最常见和常用的协议之一,设计它的目的是保证客户机和服务器之间的通信. HTTP 的工作方式是客户机与服务器之间的 "请求-应答" 协议. 客户端可以是 Web 浏览器,服务器端可以是计算机上的某些网络应用程序. 通常情况下,由浏览器向服务器发起 HTTP 请求,服务器向浏览器返回响应.响应包含了请求的状态信息以及可能被请求的内容. Go 语言中要请求网页时,使用net/http包实现.官方已经提供了详细的说明,但是比较粗略,

  • golang使用http client发起get和post请求示例

    golang要请求远程网页,可以使用net/http包中的client提供的方法实现.查看了官方网站有一些示例,没有太全面的例子,于是自己整理了一下: get请求 func httpGet() { resp, err := http.Get("http://www.01happy.com/demo/accept.php?id=1") if err != nil { // handle error } defer resp.Body.Close() body, err := ioutil

  • Go语言开发发送Get和Post请求的示例

    在使用Go语言进行开发的时候,有的时候可能要发送get或者post请求,下面我对post和get请求做一下简单的介绍:关于 HTTP 协议 HTTP(即超文本传输协议)是现代网络中最常见和常用的协议之一,设计它的目的是保证客户机和服务器之间的通信. HTTP 的工作方式是客户机与服务器之间的 "请求-应答" 协议. 客户端可以是 Web 浏览器,服务器端可以是计算机上的某些网络应用程序. 通常情况下,由浏览器向服务器发起 HTTP 请求,服务器向浏览器返回响应.响应包含了请求的状态信息

  • 详解Go语言中Get/Post请求测试

    目录 gin安装 Get请求测试 Post请求测试 基础语法差不多了,需要开始实践到一下项目,先来web框架gin吧,做一个后端web服务. 在把项目搭建起来的过程中,我也要结合实际的工作经验,补充一些项目结构.开发组件上的理解. 项目地址:github地址 gin安装 先将gin安装一下,安装依赖go语言还是比较方便的. 在安装之前先配置一下goproxy. 命令如下: go env -w GO111MODULE=on go env -w GOPROXY=https://mirrors.ali

  • 详解Go语言中Goroutine退出机制的原理及使用

    目录 退出方式 进程/main函数退出 通过channel退出 通过context退出 通过Panic退出 等待自己退出 阻止goroutine退出的方法 通过sync.WaitGroup 通过channel 封装 总结 goroutine是Go语言提供的语言级别的轻量级线程,在我们需要使用并发时,我们只需要通过 go 关键字来开启 goroutine 即可.作为Go语言中的最大特色之一,goroutine在日常的工作学习中被大量使用着,但是对于它的调度处理,尤其是goroutine的退出时机和

  • 详解C语言中return与exit的区别

    详解C语言中return与exit的区别 1,exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的.main函数结束时也会隐式地调用exit函数.exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流.关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件.exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程,而return是返回函数值并退出函数 2,return是语言级别的,它

  • 详解 Go 语言中 Map 类型和 Slice 类型的传递

    Map 类型 先看例子 m1: func main() { m := make(map[int]int) mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) { m[1] = 100 m[2] = 200 } 结果是 map[2:200 1:100] 我们再修改如下 m2: func main() { var m map[int]int mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) {

  • 详解C语言中Char型指针数组与字符数组的区别

    详解C语言中Char型指针数组与字符数组的区别 1.char 类型的指针数组:每个元素都指向一个字符串,指向可以改变 char *name[3] = { "abc", "def", "gbk" }; for(int i = 0 ; i < strlen(name); i ++){ printf("%s\n", *(name+i)); //printf("%s\n", name[i]); } //指向改

  • 详解Go语言中for range的"坑"

    前言 Go 中的for range组合可以和方便的实现对一个数组或切片进行遍历,但是在某些情况下使用for range时很可能就会被"坑",下面用一段代码来模拟下: func main() { arr1 := []int{1, 2, 3} arr2 := make([]*int, len(arr1)) for i, v := range arr1 { arr2[i] = &v } for _, v := range arr2 { fmt.Println(*v) } } 代码解析

  • 详解Golang语言中的interface

    interface是一组method签名的组合,interface可以被任意对象实现,一个对象也可以实现多个interface.任意类型都实现了空interface(也就是包含0个method的interface),空interface可以存储任意类型的值.interface定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口. go version go1.12 package main import ( "fmt" ) // 定义struct type Hu

  • 详解go语言中type关键词的几种使用

    type是go语法里的重要而且常用的关键字,type绝不只是对应于C/C++中的typedef.搞清楚type的使用,就容易理解go语言中的核心概念struct.interface.函数等的使用.以下我用例子代码总结描述,请特别留意代码中的注释. 1.定义结构体 //结构体定义 type person struct { name string //注意后面不能有逗号 age int } func main() { //结构体初始化 p := person{ name: "taozs",

  • 详解R语言中的PCA分析与可视化

    1. 常用术语 (1)标准化(Scale) 如果不对数据进行scale处理,本身数值大的基因对主成分的贡献会大.如果关注的是变量的相对大小对样品分类的贡献,则应SCALE,以防数值高的变量导入的大方差引入的偏见.但是定标(scale)可能会有一些负面效果,因为定标后变量之间的权重就是变得相同.如果我们的变量中有噪音的话,我们就在无形中把噪音和信息的权重变得相同,但PCA本身无法区分信号和噪音.在这样的情形下,我们就不必做定标. (2)特征值 (eigen value) 特征值与特征向量均为矩阵分

  • 详解C++语言中std::array的神奇用法

    概述 std::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此,使得std::array有很多与其他容器不同的特殊之处,比如:std::array的元素是直接存放在实例内部,而不是在堆上分配空间:std::array的大小必须在编译期确定:std::array的构造函数.析构函数和赋值操作符都是编译器隐式声明的--这让很多用惯了std::vector这类容器的程序员不习惯,觉得std::array不好用.但实际上,std::array的威力

随机推荐