Go语言 -- Web开发基础学习 net/http包

news2024/12/28 20:18:45

前言

Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。
Go语言最擅长的领域就是Web开发,此贴是本人入门完go语法基础后学习Web开发的学习笔记。

第一个Go Web

新建go文件hello_world.go 写入:

package main

import (
	"fmt"
	"net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
	fmt.Println("hello world")
}

func main() {
	server := &http.Server{
		Addr: "0.0.0.0:80",
	}
	http.HandleFunc(
		"/",
		hello,
	)
	server.ListenAndServe()
}

在命令行运行:
go run ./hello_world.go

在这里插入图片描述

可以发现控制台输出以下信息

Web程序运行原理

通过上述代码可以看到,要编写一个Web服务器端程序是很简单的:只是要调用net/http包中的HandleFunc()处理器函数和==ListenAndServe()==函数即可。

Go通过简单的几行代码,就可以运行一个Web服务端程序。

注:通过go程序构建起来的服务端程序拥有高并发的特性。

  • 运行原理

首先来讲讲用户浏览网页的原理:
(1)用户打开客户端浏览器,输入URL地址。
(2)客户端浏览器通过HTTP协议向服务器发送浏览请求。
(3)服务器端通过CGI程序接收请求,如果在客户端浏览器请求的资源包不含动态语言的内容,则服务端CGI程序直接通过HTTP协议向客户端浏览器发送应答包。
(4)客户端浏览器解释并显示HTML页面

其中客户端浏览器通过与服务器端建立连接,发起请求(请求一般为GET或者POST请求),再由客户端进行HTTP响应。

  • Web应用程序的组成

Web应用程序负责调用动态语言的解释引擎负责处理”动态内容”,一般由处理器和模板引擎组成。
通常情况下,处理器会接收HTTP请求,然后解析路由,最后将URL映射到对应的控制器中。

  • MVC模式

MVC模式是软件工程中的一种常用的软件架构模式,它把软件系统分为3个基础部分:模型(Model)、视图(View)、控制器(Controller)。

模型:用于处理与应用程序业务逻辑相关的数据,以及封装对数据的处理方法。模型有对数据直接访问的权力,例如对数据库的访问。
视图:能够实现数据有目的的显示。在视图中一般没有程序的逻辑。
控制器:起到组织不同层面间的作用,用于控制应用程序的流程。它处理事件并作出响应。事件包括用户的请求处理和与模型的交互。

创建简单的服务器端

(1)创建和解析HTTP服务器端
需要用HandleFunc()函数注册路由,然后通过ListenAndServe()函数开启对客户端的监听。

package main

import "net/http"

func SayHello(w http.ResponseWriter,r *http.Request){
	w.Write([]byte("Hello"))
}
func main(){
	http.HandleFunc("/hello",SayHello)   //注册路由和设置回调函数
	http.ListenAndServe("8080",nil)  //开启对客户端的监听
}

(2) 内部调用逻辑分析
http.ListenAndServe的第一个参数是端口号,第二个参数是事件处理器handler。
在go语言中handler接口的定义如下:

type Handler interface{
	ServeHTTP(ResponseWriter,*Request)
}

也就是说,只要实现这个接口,就可以实现自己的handler处理器Go语言在net/http包中已经提供了实现这个接口的公共方法:

type HandlerFunc func(ResponseWriter *Request)
func (f HandlerFunc) ServeHTTP(w,ResponseWriter,r *Request){
	f(w,r)
}

在 Go 语言中,实现 Handler 接口需要定义一个函数,该函数接受一个 http.ResponseWriter 和一个 *http.Request 参数,并返回一个 http.Handler 对象。示例:

package main  
  
import (  
    "fmt"  
    "net/http"  
)  
  
type MyHandler struct {  
    // 这里可以定义一些成员变量或者方法  
}  
  
func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {  
    fmt.Fprintln(w, "Hello, world!")  
}  
  
func main() {  
    var h MyHandler  
    http.ListenAndServe(":8080", &h)  
}

上面的示例中,我们定义了一个 MyHandler 结构体,并在其中实现了一个 ServeHTTP 方法。该方法接受一个 http.ResponseWriter 和一个 *http.Request 参数,并返回一个 http.Handler 对象。在方法中,我们简单地输出了一条 “Hello, world!” 的消息。最后,我们在 main 函数中创建了一个 MyHandler 对象,并将其传递给 http.ListenAndServe 函数来启动一个 HTTP 服务器。



创建跳转Web服务器端

package main

import "net/http"

type Refer struct {
	handler http.Handler
	refer   string
}

func (this *Refer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if r.Referer() == this.refer {
		this.handler.ServeHTTP(w, r)
	} else {
		w.WriteHeader(403)
	}
}

func myHandler(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("this is handler"))
}

func hello(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello"))
}

func main() {
	referer := &Refer{
		handler: http.HandlerFunc(myHandler),
		refer:   "www.baidu.com",
	}

	http.HandleFunc("/hello", hello)
	http.ListenAndServe(":8080", referer)
}

创建简单客户端

在net/http包中还提供了一个被称为Client的结构体。该结构体位于库文件 src/net/http/client.go 中,并且还提供了一个默认的变量可直接使用:

var DefaultClient = &Client{}

Client结构体实现了Get()、Post()两个请求函数

1、创建GET请求

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main(){
	resp,err := http.Get("https://www.baidu.com")
	if err!=nil{
		fmt.Print("err",err)
	}
	closer := resp.Body
	bytes,err:=ioutil.ReadAll(closer)
	fmt.Println(string((bytes)))
}

2、Post请求

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main(){
	url := "https://www.shirdon.com/comment/add"
	body:="xxxxx"
	response,err:=http.Post(url,"xxxx")
	if err != nil{
		fmt.Println("err",err)
		
	}
	b,err := ioutil.ReadAll(respose.Body)
	fmt.Println(string(b))
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/568071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业级信息系统开发——初探Spring AOP

文章目录 一、提出游吟诗人唱赞歌任务(一)采用传统方式实现(二)采用传统方式实现的缺点 二、采用配置方式使用AOP(一)创建本讲所需子包(二)创建杀龙任务类(三&#xff09…

VESD静电监控系统:提高静电防护效果与管理效率

随着科学技术不断发展,现代的工业对静电防护的要求越来越高。因为静电的存在可能会对产品质量、工作环境、甚至是人身产生威胁。静电监控系统是一项高效的管理工具,能够有效地控制和监测静电产生的情况,提高静电防护效果和管理效率。 VESD静电…

群晖DS920 video station使用教程

群晖DS920 video station使用教程 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000 安装video station在群晖套件里点一下就好,这里不说了。 一、添加视频库 可以添加电视剧、电视节目等类型。 比如我在国产剧这个视频…

写出诗一样代码的灵丹妙药: const与assert

🤩本文作者:大家好,我是paperjie,感谢你阅读本文,欢迎一建三连哦。 🥰内容专栏:这里是《C知识系统分享》专栏,笔者用重金(时间和精力)打造,基础知识一网打尽,…

网络安全好就业吗?会不会容易被淘汰?

网络安全发展前景好吗?好就业吗?会不会容易被淘汰?很多刚入门或者想入门的小伙伴都会有这样的疑问 今天就在这里给大家介绍一下。我就在这个行业,目前湖南,薪资就没必要说了,高就对了。 这个行业优势就是工…

互联网营销推荐算法理论-30分钟理解协同过滤

一、协同过滤概念 不论在淘宝还是京东,你浏览了/购买了某个商品A,后面几天你在该app内总是会在首页看到商品A和商品A相似的商品,背后支撑这种能力的就是推荐系统,而其推荐算法可能就是协同过滤。(注:app内…

Scala学习(九)---List集合

文章目录 1.List1.1 不可变List集合1.2 可变集合ListBuffer 1.List List集合默认为不可变集合,List集合在实例化的时候,无法通过new关键字进行实例化,只能通过伴生apply方法来对其进行实例化 1.1 不可变List集合 创建一个不可变list集合 …

真题详解(树的结点)-软件设计(八十四)

真题详解(汇总)-软件设计(八十三)https://blog.csdn.net/ke1ying/article/details/130856130?spm1001.2014.3001.5501 COCOMOII估算不包括_____。 对象点 B.功能点 C.用例数 D.源代码行 答案:C 语法翻译是一种&#xff…

【vue3】 实现 公共搜索组件,在当前页搜索的路由跳转不能改变当前值的操作,使用bus / event-emitter 派发器

一、安装 bus 插件 cnpm install --save event-emitter 二、创建 bus.ts 文件 1、在utils下创建bus.ts 2、bus.ts 代码如下 import ee from event-emitter export default ee() 三、页面使用 1、搜索的公用组件页面&#xff0c;search.vue <el-input v-model.trim&qu…

全网最详细实现微信小程序小程序支付功能【前端部分】

文章目录 功能描述&#xff1a;准备工作申请微信支付接口权限 微信支付api需要的参数说明示例代码 需要传入后端接口的参数说明&#xff1a;接口返回的参数说明&#xff1a;支付逻辑代码&#xff08;只包含支付功能&#xff09;以下是功能完整代码确认订单页面结构部分逻辑部分…

【阿里云】文本转语音方言— 阿里云语音合成,文本转语音方言工具类

目录 一、导入SDK坐标 二、文本转语音方言 —步骤和工具类 1.登录阿里云账号&#xff0c;创建一个语音合成项目和创建用户并设置权限。 2.获取appKey、accessKeyId、accessKeySecret在相应位置进行填写。 3.相应位置填写自己需要保存的本地路径。意思就是说&#xff0c;自…

【HarmonyOS】低代码元服务开发中的地图实现

在元服务开发过程中&#xff0c;大家可能需要在应用中使用地图&#xff0c;如果使用SDK集成的方式&#xff0c;地图SDK包体积大小很大&#xff0c;集成后元服务大小可能会超过10M&#xff0c;这就超出了HAP包的大小限制。那么是否有其他途径可以在元服务中使用地图呢&#xff1…

视频理解学习笔记(一):双流卷积神经网络

视频理解学习笔记&#xff08;一&#xff09;&#xff1a;双流卷积神经网络 两句话总结双流卷积神经网络论文概览方法详解Spatial stream ConvNetTemporal stream ConvNet测试方法 光流什么是光流怎么预处理光流 数据集UCF101&#xff08;已被刷爆&#xff09;HMDB51 Experimen…

安装包UI美化之路-Electron打包出界面美观,功能完善的安装包,这三步就够了

这篇文章应该说是《安装包UI美化之路-nsNiuniuSkin安装包制作可视化配置向导》的延伸与进一步应用&#xff0c;在可视配置的基础之上&#xff0c;生成供electron-builder打包的脚本&#xff01; 一直有朋友反馈&#xff0c;不知道如何将nsNiuniuSkin与Electron打包结合起来&am…

Real-Time C++ 嵌入式C++ 程序设计(二)

翻译自 Real-Time C Efficient Object-Oriented and Template Microcontroller Programming 4th Edition - Kormanyos, Christopher&#xff0c;这书涉及了从C11 到C20 的内容&#xff0c;主要介绍使用C 的模板、面向对象等特性设计嵌入式程序。书里的示例代码都是公开的&#…

【OpenCV DNN】Flask 视频监控目标检测教程 03

欢迎关注『OpenCV DNN Youcans』系列&#xff0c;持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 03 3.3 上传本地图片进行人脸检测3.3.1 OpenCV 级联分类器类 cv::CascadeClassifier3.3.2 cvFlask03 项目的构建步骤 本系列从零开始&#xff0c;详细讲解使用 Flask 框架…

Unity3D :运行时 UI 的性能注意事项

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 运行时 UI 的性能注意事项 本页介绍如何提高运行时的性能用户界面 . 优化数据存储 您可以使用 usageHints 来设置元素在运行时的使用方式&#xff0c;以便相应地优化数据存储。例…

三、CNNs网络架构-跨层连接思想的网络架构

《A review of convolutional neural network architectures and their optimizations》论文指出随着网络架构的深入&#xff0c;梯度消失、爆炸或退化问题变得越来越严重。跨层连接的思想是解决现有问题的有效方案&#xff0c;允许网络在非相邻层之间传递信息。因此&#xff0…

如何利用Python中的pymysql库来操作Mysql数据库,看这篇就够啦~

为了使python连接上数据库&#xff0c;你需要一个驱动&#xff0c;这个驱动是用于与数据库交互的库&#xff0c;本文是向大家介绍了如何利用python中的pymysql库来操作mysql数据库。 1、什么是pymysql&#xff1f; pymysql是从python连接到mysql数据库服务器的接口&#xff0c…

上门服务小程序|东邻到家系统|上门服务系统包含哪些功能?

使用东郊到家小程序&#xff0c;只需要一键预约即可在工作之余、休息娱乐的时候&#xff0c;点一个理按疗摩技师&#xff0c;做一个SPA&#xff0c;缓解工作压力&#xff0c;不失为一种享受&#xff0c;并且上门服务小程序可以为技师或从业岗位人员提供就业服务&#xff0c;线上…