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

这篇具有很好参考价值的文章主要介绍了Go语言 -- Web开发基础学习 net/http包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

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

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

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请求文章来源地址https://www.toymoban.com/news/detail-459875.html

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))
	
}

到了这里,关于Go语言 -- Web开发基础学习 net/http包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Go语言开发】简单了解一下搜索引擎并用go写一个demo

    这篇文章我们一起来了解一下搜索引擎的原理,以及用go写一个小demo来体验一下搜索引擎。 搜索引擎一般简化为三个步骤 爬虫:爬取数据源,用做搜索数据支持。 索引:根据爬虫爬取到的数据进行索引的建立。 排序:对搜索的结果进行排序。 然后我们再对几个专业名词做

    2024年02月16日
    浏览(34)
  • 【Go】Go语言开发0基础7天入门 - 笔记

    课程来源:【路飞学城】-黑金年卡VIP课程 课程名称:GO语言开发0基础7天入门 讲师:【 前汽车之家架构师 】Wusir-银角大王 官网:点击进入 集python简洁 + C语言性能 详情点击 编程语言 实战经验 源码 并发架构 新语言触类旁通 1.1 开篇介绍(必看) 1.2 环境搭建前戏 1.3 mac系统G

    2024年02月16日
    浏览(36)
  • 将Go语言开发的Web程序部署到K8S

    如果已经有K8S环境的同学可以跳过,如果没有,推荐你看看我的《Ubuntu22加Minikue搭建K8S环境》,课程目录如下: 下载:https://code.visualstudio.com/Download 安装命令: 下载:https://studygolang.com/dl 将其上传到Downloads目录下。 解压: 将其移动到特定目录: 配置环境变量: 激活环境变

    2024年02月03日
    浏览(37)
  • 【Go 基础篇】Go语言包详解:模块化开发与代码复用

    在Go语言中, 包(Package) 是一种用于组织代码的机制,用于将相关的函数、类型和变量等组织在一起,以便于模块化开发和代码复用。包的使用能够使程序结构更加清晰、可维护性更高,同时也是Go语言强调的一项重要特性。本篇博客将深入探讨Go语言中包的相关知识,包括

    2024年02月11日
    浏览(22)
  • 【Python爬虫开发基础⑥】计算机网络基础(Web和HTTP)

    专栏 :python网络爬虫从基础到实战 欢迎订阅!近期还会不断更新~ 另外 :如果想要看更多的计算机网络知识,可以关注我的专栏:计算机网络 往期推荐 : 【Python爬虫开发基础①】Python基础(变量及其命名规范) 【Python爬虫开发基础②】Python基础(正则表达式) 【Python爬虫

    2024年02月12日
    浏览(40)
  • go语言从0基础到安全项目开发实战

    搭建环境比较简单 到以下链接下 Go下载 - Go语言中文网 - Golang中文社区 下载windows版本64位zip包 https://studygolang.com/dl/golang/go1.20.7.windows-amd64.zip 不配置的话就只能在bin目录下才能运行go命令 创建test.go文件 然后代码如下 编译运行  两种方式编译运行代码 1.先 go build test.go编译成

    2024年02月13日
    浏览(33)
  • Go学习圣经:Go语言实现高并发CRUD业务开发

    现在 拿到offer超级难 ,甚至连面试电话,一个都搞不到。 尼恩的技术社群中(50+),很多小伙伴凭借 “左手云原生+右手大数据”的绝活,拿到了offer,并且是非常优质的offer, 据说年终奖都足足18个月 。 第二个案例就是:前段时间,一个2年小伙伴希望涨薪到18K, 尼恩把

    2024年02月11日
    浏览(42)
  • Go net http包

    在Go中,搭建一个HTTP server简单到令人难以置信。只需要引入net/http包,写几行代码,一个HTTP服务器就可以正常运行并接受访问请求。 下面就是Go最简单的HTTP服务器: 编译运行程序,然后打开浏览器访问 http://localhost:8080/ , 我们可以看到网页输出\\\"hi\\\" ! 就这么简单,我们实现了

    2024年02月08日
    浏览(31)
  • 【go语言开发】本地缓存的使用,从简单到复杂写一个本地缓存,并对比常用的开源库

    本文主要介绍go语言中本地缓存的使用,首先由简单到复杂手写3个本地缓存示例,使用内置的sync,map等数据结构封装cache,然后介绍常见的一些开源库,以及对比常用的开源库 本地缓存 是指将一部分数据存储在应用程序本地内存中,以提高数据访问速度和应用程序性能的技

    2024年02月04日
    浏览(24)
  • GO学习之 网络通信(Net/Http)

    1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Http) 11、GO学习之 微框架(Gin) 12、GO学习

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包