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服务器,存储数据。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css 居中方式

居中分为水平居中和垂直居中 1. 水平居中1.1 文字text-align:center;1.2 盒子1.2.1&#xff1a;inline-block text-align 一 center;1.2.2&#xff1a;absolutetransform 一 父元素 display:relative;子元素 display:absolute; left:50%;transform: translatex(-50%);1.2.3&a…

Git教程学习:03 记录每次更新到仓库

文章目录 1 检查当前文件状态2 跟踪新文件3 暂存已修改的文件4 状态简览5 忽略文件6 查看已暂存和未暂存的修改7 提交更新8 跳过使用暂存区域9 移除文件10 移动文件 现在我们的机器上有了一个 真实项目 的 Git 仓库&#xff0c;并从这个仓库中检出了所有文件的 工作副本。 通常…

git设置代理

git设置代理 git config --global http.proxy 127.0.0.1:7890git查询代理 git config --global http.proxy git取消代理 git config --global --unset http.proxy

揭开UI设计的神秘面纱:如何打造一款让用户爱不释手的移动APP

文章目录 一、目标用户分析二、设计风格和色彩搭配三、布局和导航设计四、交互设计五、视觉元素设计六、响应式设计七、测试和优化八、持续更新和迭代九、团队协作和沟通十、学习和成长《移动APP UI设计与制作(微课版)》编辑推荐内容简介目录 《Flutter入门经典&#xff08;移动…

matlab simulink 7自由度横向车辆模型

1、内容简介 略 32-可以交流、咨询、答疑 2、内容说明 图一.七自由度车辆动力学模型 纵向力平衡方程&#xff1a; ① 侧向力平衡方程&#xff1a; ② 绕Z轴力矩平衡方程&#xff1a; ③ 四个车轮的力矩平衡方程&#xff1a; ④ 上述方程中&#xff1a;δ为前轮转角&#x…

官宣!Meta正在训练Llama 3,将继续开源

1月19日&#xff0c;全球社交、科技巨头Meta的联合创始人兼首席执行官-Zuck&#xff08;扎克伯格&#xff09;在is宣布&#xff0c;正在训练Llama 3并且以负责任地方式继续开源。 Zuck表示&#xff0c;预计到2024年底&#xff0c;Meta将拥有350,000块H100&#xff0c;如果算上…

PyTorch各种损失函数解析:深度学习模型优化的关键(1)

目录 详解pytorch中各种Loss functions binary_cross_entropy 用途 用法 参数 数学理论 示例代码 binary_cross_entropy_with_logits 用途 用法 参数 数学理论 示例代码 poisson_nll_loss 用途 用法 参数 数学理论 示例代码 cosine_embedding_loss 用途 …

数据结构--串

本文为复习的草稿笔记&#xff0c;&#xff0c;&#xff0c;有点乱 1. 串的基本概念和基本操作 串是由零个或多个字符组成的有限序列 2. 串的存储结构 3.串的应用 模式匹配 BF算法&#xff08;简单匹配算法 穷举法 算法思路&#xff1a;从子串的每一个字符开始依次与主串…

卷积神经网络和深度神经网络的区别与联系

DNN是指深度神经网络&#xff0c;它是一个很广的概念&#xff0c;某种意义上CNN、RNN、GAN等都属于其范畴之内。DNN与CNN&#xff08;[卷积神经网络&#xff09;的区别是DNN特指全连接的神经元结构&#xff0c;并不包含卷积单元或是时间上的关联。其中最初的神经网络的所有隐含…

尚硅谷Nginx高级配置笔记

写在前面&#xff1a;本笔记是学习尚硅谷nginx可成的时候的笔记&#xff0c;不是原创&#xff0c;如有需要&#xff0c;可以去官网看视频&#xff0c;以下是pdf文件 Nginx高级 第一部分&#xff1a;扩容 通过扩容提升整体吞吐量 1.单机垂直扩容&#xff1a;硬件资源增加 云…

基于Java SSM框架实现中学校园网站管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现中学校园网站管理系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认…

2024-01-15(SpringMVCMybatis)

1.拦截器&#xff1a;如果我们想在多个handler方法(controller中的方法)执行之前或者之后都进行一些处理&#xff0c;甚至某些情况下需要拦截掉&#xff0c;不让handler方法执行&#xff0c;那么就可以使用SpringMVC为我们提供的拦截器。 拦截器和过滤器的区别&#xff1a;过滤…