GO基础进阶篇 (十四)、Http编程

这篇具有很好参考价值的文章主要介绍了GO基础进阶篇 (十四)、Http编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Web基础概念

web应用程序

web程序可以提供浏览器访问的程序。Web应用程序通常采用客户端-服务器模型。客户端是用户使用的Web浏览器或其他Web客户端,而服务器是存储和处理数据的远程计算机。
我们能访问到的任何一个页面或资源,都存在于世界的某一个角落的计算机上。

HTTP

HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的协议,是Web上数据通信的基础。HTTP是一个客户端-服务器协议,客户端发起请求,服务器提供响应。

  • 文本:html、字符串、数字。。。
  • 超文本:图片、视频、音频。。。
  • 规定使用80端口

以下是HTTP的一些关键特点和基本概念:

  1. 无状态协议: HTTP是无状态的,即每个请求都是独立的,服务器不会保留前一次请求的任何信息。为了维护状态,通常使用会话(Session)机制或者使用Cookies。

  2. 请求和响应: HTTP通信由客户端的请求和服务器的响应组成。请求包括一个HTTP方法(GET、POST等)、URL、HTTP版本、请求头部和请求体。响应包括HTTP版本、状态码、响应头部和响应体。

  3. URL(Uniform Resource Locator): URL是用于标识和定位资源的地址。它包括协议(如http://或https://)、主机名、端口号、路径和查询参数等。

  4. HTTP方法: 常见的HTTP方法包括:

    • GET: 用于请求资源。
    • POST: 用于提交数据给指定资源,通常用于表单提交。
    • PUT: 用于更新或创建资源。
    • DELETE: 用于删除资源。
    • 等等。
  5. 状态码: 服务器在响应中返回一个状态码,指示请求的处理结果。常见的状态码包括:

    • 200 OK: 请求成功。
    • 404 Not Found: 请求的资源未找到。
    • 500 Internal Server Error: 服务器内部错误。
    • 等等。
  6. 头部信息: HTTP请求和响应都包含头部信息,包括元数据、控制信息等。头部可以包括Content-Type、Content-Length、Cache-Control等。

  7. 持久连接: HTTP支持持久连接,可以在单个连接上发送多个请求和接收多个响应,以减少连接的开销。

  8. 安全性: HTTPS(HTTP Secure)是HTTP的安全版本,通过使用TLS/SSL协议对通信进行加密,以提供更安全的数据传输。

http编写web应用

了解了web基础,我们尝试使用go语言的‘http’包,来模拟实现一个客户端-服务端的web应用。

//服务端代码
//server.go
package main

import (
	"fmt"
	"net/http"
)

func main() {
	//请求处理
	http.HandleFunc("/hello", hello)

	http.ListenAndServe("127.0.0.1:8080", nil)

}

func hello(w http.ResponseWriter, r *http.Request) {
	fmt.Println(r.URL)

	fmt.Println("有人访问了程序")
	w.Write([]byte("<h1>heiheihei</h1>"))
}

//hello
//有人访问了程序
//客户端代码
//client.go
package main

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

func main() {
	resp, err := http.Get("http://127.0.0.1:8080/hello")
	if err != nil {
		fmt.Println(111, err)
	}
	defer resp.Body.Close()

	buf := make([]byte, 1024)

	for {
		n, err := resp.Body.Read(buf)
		if err != nil && err != io.EOF {
			fmt.Println(err)
			return
		} else {
			fmt.Println("信息读取完毕")
			fmt.Println("data", string(buf[:n]))
			break
		}
	}
}

//信息读取完毕
//data <h1>heiheihei</h1>

处理携带query参数的请求

我们模拟一个登录过程,看看go语言中如何处理请求参数。

//server.go
package main

import (
	"fmt"
	"net/http"
)

func main() {
	//请求处理
	http.HandleFunc("/login", login)

	http.ListenAndServe("127.0.0.1:8080", nil)

}

func login(w http.ResponseWriter, r *http.Request) {
	fmt.Println(r.URL)

	data := r.URL.Query()
	username := data.Get("username")
	password := data.Get("password")
	fmt.Println(username, password)
	if username == "admin" {
		w.Write([]byte("{status:ok}"))
	} else {
		w.Write([]byte("{status:fail}"))
	}
}

//admin 123456

上面的服务端代码中,解析get中的query参数,并判断用户进行登录。

//client.go
package main

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

func main() {
	urlStr := "http://127.0.0.1:8080/login"

	data := url.Values{}
	data.Set("username", "admin")
	data.Set("password", "123456")
	rurl, _ := url.ParseRequestURI(urlStr)
	rurl.RawQuery = data.Encode()
	fmt.Println(rurl.String())

	resp, _ := http.Get(rurl.String())
	b, _ := io.ReadAll(resp.Body)
	fmt.Println(string(b))
	
}

//{status:ok}

上面的客户段模拟代码中,拼接参数,并向服务端发送请求。通过io解析响应流。

处理表单请求

//服务端
package main

import (
	"fmt"
	"net/http"
)

func main() {
	//请求处理
	http.HandleFunc("/register", register)

	http.ListenAndServe("127.0.0.1:8081", nil)

}

func register(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()
	fmt.Println(111, r.ParseForm())
	username := r.PostForm.Get("username")
	password := r.PostForm.Get("password")
	fmt.Println(username, password)
	oUsername := "admin"
	if oUsername == username {
		w.Write([]byte("{msg:'用户已存在'}"))
	} else {
		w.Write([]byte("{msg:'用户注册成功'}"))
	}
}

通过PostForm来解析post请求携带的数据

客户端我们通过postman简单模拟一下
GO基础进阶篇 (十四)、Http编程,GO语言从基础到应用,golang,http,开发语言

通过以上的学习。我们基本了解了Go语言如何实现客户端-服务端之间的通信交互。后续将会继续探索数据库及一些成熟go语言web框架。来快速搭建和编写web服务器,存储数据。文章来源地址https://www.toymoban.com/news/detail-804530.html

到了这里,关于GO基础进阶篇 (十四)、Http编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

    在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义如下: 指针: 指向

    2024年02月14日
    浏览(43)
  • 【Golang】Golang进阶系列教程--Go 语言 map 如何顺序读取?

    Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。 然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。 先看一段代码示例: 当我们多执行几次这段代码时,就会发现,输出的顺序是不同的。 首先,Go 语言

    2024年02月14日
    浏览(47)
  • 【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

    在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 数组和切片是两个常用的数据结构。它们都可以用于存储一组相同类型的元素,但在底层实现和使用方式上存在一些重要的区别。 Go 中数组的长度是不可改变的

    2024年02月15日
    浏览(45)
  • 【Golang】Golang进阶系列教程--为什么 Go 语言 struct 要使用 tags

    在 Go 语言中,struct 是一种常见的数据类型,它可以用来表示复杂的数据结构。在 struct 中,我们可以定义多个字段,每个字段可以有不同的类型和名称。 除了这些基本信息之外,Go 还提供了 struct tags,它可以用来指定 struct 中每个字段的元信息。 在本文中,我们将探讨为什

    2024年02月15日
    浏览(60)
  • Go语言(Golang)数据库编程

    要想连接到 SQL 数据库,首先需要加载目标数据库的驱动,驱动里面包含着于该数据库交互的逻辑。 sql.Open() 数据库驱动的名称 数据源名称 得到一个指向 sql.DB 这个 struct 的指针 sql.DB 是用来操作数据库的,它代表了0个或者多个底层连接的池,这些连接由sql 包来维护,sql 包会

    2024年02月03日
    浏览(68)
  • 【Golang】Golang进阶系列教程--为什么说 Go 语言字符串是不可变的?

    最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢? 这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。 首先来看看它的底层结构: 和切片的结构很像,只不过少了一个

    2024年02月14日
    浏览(43)
  • 【Golang】go编程语言适合哪些项目开发?

    前言 在当今数字化时代,软件开发已成为各行各业的核心需求之一。 而选择适合的编程语言对于项目的成功开发至关重要。 本文将重点探讨Go编程语言适合哪些项目开发,以帮助读者在选择合适的编程语言时做出明智的决策。 Go 编程语言适合哪些项目开发? Go是由Google开发

    2024年02月04日
    浏览(60)
  • Go语言入门记录:从channel的池应用、sync的Pool、benchmark、反射reflect、json处理、http、性能分析和一些编程习惯

    channel的一对一会阻塞,添加buffer不会阻塞。 buffered Channel实现对象池。 sync.Pool 的介绍。 获取时先去私有对象中获取,如果不存在就在相同Processor中的共享池中获取,如果还没有,则去其他Processor中去获取。 存放时,如果私有对象不存在,就放在私有对象中,如果存在就放在

    2024年02月10日
    浏览(36)
  • Go 语言并发编程 及 进阶与依赖管理

    协程可以理解为 轻量级线程 ; Go更适 合高并发场景原因 之一: Go语言 一次可以创建上万协成 ; “快速”: 开多个协成 打印。 go func() : 在 函数前加 go 代表 创建协程 ; time.Sleep() : 协程阻塞,使主协程 在 子协程结束前阻塞不退出 ; 乱序输出 说明并行 ; 通过通信共享内

    2024年02月13日
    浏览(38)
  • Go语言网络编程(socket编程)http编程

    Web服务器的工作原理可以简单地归纳为 客户机通过TCP/IP协议建立到服务器的TCP连接 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档 服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“

    2024年02月09日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包