当前位置: 首页 > news >正文

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 mainimport ("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 mainimport ("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 mainimport ("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 mainimport ("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 mainimport ("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语言如何实现客户端-服务端之间的通信交互。后续将会继续探索数据库及一些成熟go语言web框架。来快速搭建和编写web服务器,存储数据。

相关文章:

  • 现阶段Python和Java哪个更吃香?
  • 代码随想录算法训练营第二十三天| 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
  • 网络安全(黑客)—2024秩序
  • 实验二 体系结构
  • 红队打靶练习:HOLYNIX: V1
  • 爬虫案例—抓取豆瓣电影的电影名称、评分、简介、评价人数
  • C语言之三子棋游戏(棋盘)
  • 华为路由设备DHCPV6配置
  • test-02-test case generate 测试用例生成 EvoSuite 介绍
  • go语言的部分的
  • python贪吃蛇游戏
  • Pygame和Cocos2d
  • 2018年认证杯SPSSPRO杯数学建模D题(第一阶段)投篮的最佳出手点全过程文档及程序
  • 新能源汽车智慧充电桩解决方案:智慧化综合管理与数字化高效运营
  • flask不使用flask-login插件
  • 【个人向】《HTTP图解》阅后小结
  • ECS应用管理最佳实践
  • Java到底能干嘛?
  • js对象的深浅拷贝
  • Mybatis初体验
  • tweak 支持第三方库
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 阿里云Kubernetes容器服务上体验Knative
  • 浮现式设计
  • 规范化安全开发 KOA 手脚架
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 聚类分析——Kmeans
  • 蓝海存储开关机注意事项总结
  • 老板让我十分钟上手nx-admin
  • 免费小说阅读小程序
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 我的zsh配置, 2019最新方案
  • 7行Python代码的人脸识别
  • Prometheus VS InfluxDB
  • ​Java并发新构件之Exchanger
  • ​虚拟化系列介绍(十)
  • $$$$GB2312-80区位编码表$$$$
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (八十八)VFL语言初步 - 实现布局
  • (独孤九剑)--文件系统
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (接口自动化)Python3操作MySQL数据库
  • (十六)一篇文章学会Java的常用API
  • (算法二)滑动窗口
  • (转)ABI是什么
  • (转载)利用webkit抓取动态网页和链接
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • @private @protected @public