返回顶部
首页 > 资讯 > 后端开发 > GO >使用Go语言写一个Http Server的实现
  • 909
分享到

使用Go语言写一个Http Server的实现

2024-04-02 19:04:59 909人浏览 薄情痞子
摘要

目录调试功能1功能2功能3功能4Http Server 代码 Go.mod: module goStudy1 go 1.17 main.go: package main imp

Http Server 代码

Go.mod:

module goStudy1

go 1.17

main.go:

package main

import (
	"fmt"
	"os"
	"strconv"

	//"GitHub.com/thinkeridea/go-extend/exnet"
	"io"
	"log"
	"net/http"
	"strings"
)



// Main方法入口
func main() {
	println("环境正常")

	// 功能1
	http.HandleFunc("/requestAndResponse", requestAndResponse)

	// 功能2
	http.HandleFunc("/getVersion", getVersion)

	// 功能3
	http.HandleFunc("/ipAndStatus", ipAndStatus) //注册接口句柄

	// 功能4
	http.HandleFunc("/healthz", healthz) //注册接口句柄

	err := http.ListenAndServe(":81", nil) //监听空句柄,80端口被占用,使用81端口
	if nil != err {
		log.Fatal(err) //显示错误日志
	}
}

// 功能1,接收请求及响应
func requestAndResponse(response http.ResponseWriter, request *http.Request) {
	println("调用requestAndResponse接口")
	headers := request.Header //header是Map类型的数据
	println("传入的hander:")
	for header := range headers { //value是[]string
		//println("header的key:" + header)
		values := headers[header]
		for index, _ := range values {
			values[index] = strings.TrimSpace(values[index])
			//println("index=" + strconv.Itoa(index))
			//println("header的value:" + values[index])

		}
		//valueString := strings.Join(values, "")
		//println("header的value:" + valueString)
		println(header + "=" + strings.Join(values, ","))        //打印request的header的k=v
		response.Header().Set(header, strings.Join(values, ",")) // 遍历写入response的Header
		//println()

	}
	fmt.Fprintln(response, "Header全部数据:", headers)
	io.WriteString(response, "succeed")

}

// 功能2,获取环境变量的version
func getVersion(response http.ResponseWriter, request *http.Request) {
	println("调用getVersion接口")
	envStr := os.Getenv("VERSION")
	//envStr := os.Getenv("hadoop_HOME")
	//println("系统环境变量:" + envStr) //可以看到 C:\soft\hadoop-3.3.1	Win10需要重启电脑才能生效

	response.Header().Set("VERSION", envStr)
	io.WriteString(response, "succeed")

}

// 功能3,输出IP与返回码
func ipAndStatus(response http.ResponseWriter, request *http.Request) {
	println("调用ipAndStatus接口")

	fORM := request.RemoteAddr
	println("Client->ip:port=" + form) //虚拟机是桥接模式。使用postman返回的全部是127.0.0.1	用手机打开网站192.168.1.139:81/ipAndStatus可以看到新IP
	ipStr := strings.Split(form, ":")
	println("Client->ip=" + ipStr[0]) //打印ip

	// 获取http响应码
	//response.WriteHeader(301) //手动设置响应码,默认200

	//response.WriteHeader(http.StatusOK)//由于默认是调用这个,∴返回码都是这个200【server.go有源码】
	println("Client->response code=" + strconv.Itoa(http.StatusOK))

	//println("response code->:" + code)

	io.WriteString(response, "succeed")
}

// 功能4,连通性测试接口
func healthz(response http.ResponseWriter, request *http.Request) {
	println("调用healthz接口")
	response.WriteHeader(200) //设置返回码200
	//response.WriteHeader(http.StatusOK)//默认会调用这个方法,默认就是200【server.go有源码】
	io.WriteString(response, "succeed")
}

由于80端口被占用,使用了81端口。

调试

由于linux虚拟机没有安装go环境,只有windows有go环境,使用goland开发后,用postman调试。

功能1

网站:http://127.0.0.1:81/requestAndResponse

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ZN18qxd-1650553245870)(E:\study\极客时间\云原生\模块2编写Go程序\作业\goStudy1\Http Server.assets\image-20220420224510186.jpg)]

POST的request中额外配置了 k2=v1 。Send后可以看到:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sLFwYrR3-1650553245872)(E:\study\极客时间\云原生\模块2编写Go程序\作业\goStudy1\Http Server.assets\image-20220420224623797.jpg)]

Response中出现了手动新增的请求头及其它默认的请求头。【原始的response只有3对kv结果,已经遍历添加成功】。说明成功写入。

功能2

由于Windows需要重启才能刷新环境变量,故:

	//envStr := os.Getenv("VERSION")
	envStr := os.Getenv("HADOOP_HOME")

测试时,此处读取已经存在的环境变量,原理是一致的。

网站:http://127.0.0.1:81/getVersion

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5gEC5Fxw-1650553245873)(E:\study\极客时间\云原生\模块2编写Go程序\作业\goStudy1\Http Server.assets\image-20220420225251189.jpg)]

说明Go可以读取到环境变量的值,并且写入response的headers。

功能3

网站:http://127.0.0.1:81/ipAndStatus

分别用postman、手机请求这个网站【手机请求时需要和PC在同一个路由,将网站IP更换为PC的IP才可以访问】,goland中显示:

环境正常
调用getVersion接口
调用ipAndStatus接口
Client->ip:port=127.0.0.1:59595
Client->ip=127.0.0.1
Client->response code=200      
调用ipAndStatus接口
Client->ip:port=192.168.1.138:37548
Client->ip=192.168.1.138
Client->response code=200

显然读取到了client的IP。由于server.go中有写:

	// WriteHeader sends an HTTP response header with the provided
	// status code.
	//
	// If WriteHeader is not called explicitly, the first call to Write
	// will trigger an implicit WriteHeader(http.StatusOK).
	// Thus explicit calls to WriteHeader are mainly used to
	// send error codes.
	//
	// The provided code must be a valid HTTP 1xx-5xx status code.
	// Only one header may be written. Go does not currently
	// support sending user-defined 1xx informational headers,
	// with the exception of 100-continue response header that the
	// Server sends automatically when the Request.Body is read.
	WriteHeader(statusCode int)

默认的响应头就是取返回值为200,不设置就是按照默认的200来返回,故此处的响应码为200。

由于响应体引用的请求体并不包含返回码,如果直接从响应体的请求中拿返回码【request.Response.StatusCode】,会报内存错误及空指针的panic。

功能4

网址:http://127.0.0.1:81/healthz

使用postman调用接口,可以看到:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mGaVuF96-1650553245874)(E:\study\极客时间\云原生\模块2编写Go程序\作业\goStudy1\Http Server.assets\image-20220420230044921.jpg)]

默认的响应体的响应头的返回码就是200。且返回值3个。

可以看出,Go相比Java还是很简洁的。

到此这篇关于使用Go语言写一个Http Server的实现的文章就介绍到这了,更多相关Go语言Http Server内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: 使用Go语言写一个Http Server的实现

本文链接: https://lsjlt.com/news/147349.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用Go语言写一个Http Server的实现
    目录调试功能1功能2功能3功能4Http Server 代码 go.mod: module goStudy1 go 1.17 main.go: package main imp...
    99+
    2024-04-02
  • 如何使用Go语言写一个Http Server
    这篇文章主要介绍了如何使用Go语言写一个Http Server的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Go语言写一个Http Server文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-06-30
  • Go语言实现一个Http Server框架(一) http库的使用
    目录http库的使用Body和GetBodyURLRequest.URL.QueryRequest.URLHeaderMethodFormhttp库的使用 要实现一个httpServ...
    99+
    2023-05-18
    Go语言实现Http Server框架 Go语言 Http Server框架 Go语言 http库
  • Go语言Http Server框架实现一个简单的httpServer
    目录实现一个简单地httpServer首先我们来写一个接口基于http库实现一个结构体实现Server接口实现一个简单地httpServer 上一篇文章对http库的基本使用做了说明...
    99+
    2023-05-18
    Go Http Server框架 Go HttpServer
  • Go语言实现一个HttpServer框架(二)Server的抽象
    上一篇文章对http库的基本使用做了说明,下面来实现一个简单地httpServer package main import ( "fmt" "log...
    99+
    2023-05-18
    Go语言实现Http Server框架 Go语言 Http Server框架
  • 如何使用go语言书写一个区块链
    如何使用go语言书写一个区块链?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。操作环境:windows10系统、GO 1.11.2、thinkpad t480电脑。在区块链公...
    99+
    2023-06-06
  • 使用Go语言开发一个高效的队列实现
    使用Golang编写高效的队列实现 引言:队列是一种常见的数据结构,可用于实现先进先出(FIFO)的操作。在编程中,队列的实现方式各有优劣,本文将介绍使用Golang编写高效的队列实现,并给出具体的代码示例。...
    99+
    2024-01-24
    高效 (效率)
  • 如何在Django中使用Go语言编写HTTP API?
    Django是一个非常流行的Python Web框架,它有着强大的开发工具和丰富的生态系统。但是,有时候我们需要使用其他语言来实现一些特定的功能,例如Go语言的高性能和并发处理能力。在这篇文章中,我们将会介绍如何在Django中使用Go语言...
    99+
    2023-07-23
    django api http
  • 使用Go语言实现一个基本的算术运算器
    Go语言是一种开源的、静态类型的编译型语言,以其简洁、高效和易于扩展的特性而受到广泛关注和使用。本文将介绍如何使用Go语言编写一个简单的四则运算计算器,并提供具体的代码示例。首先,我们需要定义几个基本的数据结构来表示运算表达式和操作符。我们...
    99+
    2023-12-23
    Go语言 计算器 四则运算
  • 你会用Go语言编写HTTP请求吗?
    当今互联网时代,HTTP协议已经成为了互联网通讯的标准,而Go语言作为一门高效、简洁的编程语言,其在HTTP请求方面表现也十分出色。在本篇文章中,我们将一起探讨如何使用Go语言编写HTTP请求。 一、HTTP请求的基础知识 在学习HTTP请...
    99+
    2023-11-14
    http leetcode 数组
  • Go语言实现AES加密并编写一个命令行应用程序
    目录什么是AESgo实现aes加密小案例需求实战加密代码解密代码实现passctl命令行应用代码编译成二进制后使用什么是AES 关于AES更多的知识,请自行脑补,密码学中的高级加密标...
    99+
    2023-02-16
    Go语言AES加密 Go AES加密 Go语 AES
  • Go语言使用什么实现的?一文了解
    Go语言使用什么实现的? Go语言(也称为Golang)是一种由Google开发的开源编程语言,具有高效、简洁、并发的特点。那么,Go语言是如何实现这些特点的呢?本文将通过具体的代码示...
    99+
    2024-04-02
  • 用c语言编写一个幂函数(c语言实现幂函数)
    下面是一个使用C语言编写的幂函数的示例:```c#include double power(double base, int exp...
    99+
    2023-09-22
    c语言
  • 使用Go语言文档中的net/http.Handle函数实现HTTP路由
    使用Go语言的net/http包中的Handle函数可以方便地实现HTTP路由。在这篇文章中,我们将一步一步地讲解如何使用Handle函数来实现一个简单的HTTP路由器。让我们逐步展开。首先,让我们来了解一下Handle函数的基本用法。Ha...
    99+
    2023-11-03
    Go语言 HTTP路由 net/httpHandle函数
  • go语言使用什么实现的
    go语言使用称为Go Runtime的虚拟机实现的。Go语言的虚拟机是由C语言实现的,它负责Go程序的运行和管理,这个虚拟机可以在不同的操作系统上运行,包括Linux、Windows、macOS等,还提供了垃圾回收机制,可以自动管理内存,减...
    99+
    2023-07-10
  • 如何使用Go语言编写实时API?
    Go语言是一种高效、简洁、高并发的编程语言,非常适合用于开发实时API。在本篇文章中,我们将会介绍如何使用Go语言编写实时API,并通过演示代码来展示具体实现方法。 理解实时API 实时API是指在请求发出后,服务端能够立即返回实时结果...
    99+
    2023-09-12
    数组 api 实时
  • Go语言如何实现关闭http请求
    这篇文章主要介绍“Go语言如何实现关闭http请求”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言如何实现关闭http请求”文章能帮助大家解决问题。写在前面面试的时候问到如何关闭http请求,...
    99+
    2023-07-05
  • 聊聊Go语言怎么构建一个简单的HTTP服务
    在如今的软件开发领域中,Go语言已经成为了极其活跃的语言之一。与其他语言相比,Go语言独特的并发模型和轻量级的线程架构使得它非常适合构建高并发的网络应用、分布式系统和云服务。本文将介绍如何使用Go语言构建一个简单的HTTP服务,并且涉及到如...
    99+
    2023-05-14
  • go语言使用jwt认证的实现
    目录加密解密这几天在学习nodejs,进一步了解npm,学习过程中解开了以前的一个疑惑,以前不知道token可以携带信息,只以为是用来做对比的,学到了jwt身份认证,知道了如何使用的...
    99+
    2024-04-02
  • Go 语言中的 HTTP 模块:如何使用 NPM?
    在现代的 Web 应用程序开发中,HTTP 协议是不可或缺的一部分,因为它是浏览器和服务器之间进行通信的标准协议。 Go 语言在其标准库中包含了一个用于处理 HTTP 请求和响应的模块,使得在 Go 语言中开发 Web 应用程序非常方便。...
    99+
    2023-09-08
    http npm linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作