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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++大学教程(第九版)5.18进制表

目录 题目 代码 运行截图 题目 &#xff08;进制表&#xff09;编写一个程序要求打印一张表&#xff0c;内容是1~256范围内每个十进制数对应的二进制、八进制和十六进制形式。如果还不熟悉这些计数系统&#xff0c;可先阅读附录 D。提示:可以使用流操纵符dec、oct 和 hex来…

Linux操作系统----gdb调试工具(配实操图)

绪论​ “不用滞留采花保存&#xff0c;只管往前走去&#xff0c;一路上百花自会盛开。 ——泰戈尔”。本章是Linux工具篇的最后一章。gdb调试工具是我们日常工作中需要掌握的一项重要技能我们需要基本的掌握release和debug的区别以及gdb的调试方法的指令。下一章我们将进入真正…

QT+jenkins window环境实现一键自动化构建打包签名发布

jenkins + QT 自动化构建打包 1.官网下载地址: Jenkins download and deployment,下载最新版本的安装包并安装。安装过程中,会要求你输入端口号并记住。 2.java下载地址:Java Downloads | Oracle,下载最新版本的安装包并安装。 3.浏览器输入网址:127.0.0.1: port, port为…

力扣22. 括号生成

回溯 思路&#xff1a; 定义函数 dfs(item, open, close, n) 表示当前 item 有左括号个数 open 和右括号个数 close &#xff1b;使用递归&#xff0c;长度为 n 的序列就是在长度为 n - 1 的序列后加左括号或者右括号&#xff1a; 先放左括号&#xff0c;只要其个数 < n&am…

openGauss学习笔记-201 openGauss 数据库运维-常见故障定位案例-执行修改表分区操作时报错

文章目录 openGauss学习笔记-201 openGauss 数据库运维-常见故障定位案例-执行修改表分区操作时报错201.1 执行修改表分区操作时报错201.1.1 问题现象201.1.2 原因分析201.1.3 处理办法 openGauss学习笔记-201 openGauss 数据库运维-常见故障定位案例-执行修改表分区操作时报错…

web蓝桥杯真题--10、灯的颜色变化

介绍 我们经常会看到各种颜色的灯光&#xff0c;本题我们将实现一个颜色会变化的灯的效果。 准备 开始答题前&#xff0c;需要先打开本题的项目代码文件夹&#xff0c;目录结构如下&#xff1a; ├── effect.gif ├── images │ ├── greenlight.svg │ ├── l…

权威认证!腾讯微搭入选Forrester《2023年第四季度中国专业开发人员低代码平台市场分析报告》

在Forrester近日发布的《The Low-Code Platforms For Professional Developers Landscape In China,Q4 2023》&#xff08;《2023年第四季度中国专业开发人员低代码平台市场分析报告》&#xff09;中&#xff0c;腾讯云成功入选。该报告通过对中国的低代码市场进行了深入的研究…

十一、Qt Poppler打包

《一、QT的前世今生》 《二、QT下载、安装及问题解决(windows系统)》《三、Qt Creator使用》 ​​​ 《四、Qt 的第一个demo-CSDN博客》 《五、带登录窗体的demo》 《六、新建窗体时&#xff0c;几种窗体的区别》 《七、Qt 信号和槽》 《八、Qt C 毕业设计》 《九、Qt …

Linux网络编程(二-套接字)

目录 一、背景知识 1.1 端口号 1.2 网络字节序 1.3 地址转换函数 二、Socket简介 三、套接字相关的函数 3.1 socket() 3.2 bind() 3.3 connect() 3.4 listen() 3.5 accept() 3.6 read()/recv()/recvfrom() 3.7 send()/sendto() 3.8 close() 四、UPD客服/服务端实…

线程同步--生产者消费者模型

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件变量的使用必须依赖于互斥锁以确保线…

查看神经网络中间层特征矩阵及卷积核参数

可视化feature maps以及kernel weights&#xff0c;使用alexnet模型进行演示。 1. 查看中间层特征矩阵 alexnet模型&#xff0c;修改了向前传播 import torch from torch import nn from torch.nn import functional as F# 对花图像数据进行分类 class AlexNet(nn.Module):d…

Java网络编程:概述--快速入门

I. 介绍 1.1 什么是网络编程 - 网络编程是指通过计算机网络实现程序之间的通信。在Java中&#xff0c;网络编程通常涉及到数据的传输、通信协议的使用以及与网络相关的各种操作。 1.2. 为什么学习Java网络编程 - Java网络编程是Java开发者重要的技能之一&#xff0c;因为它允许…

HarmonyOS —— buildMode 设置(对比 Android Build Varient)

前言 在安卓中 Build Variant 主要依赖模块&#xff08;module&#xff09;中 build.gradle 的 BuildType 和 ProductFlavor 提供的属性和方法&#xff0c;我们可以使用 Build Type 可以配置不同的构建方式、ProductFlavor 主要用来进行多渠道打包。 在鸿蒙中要做到同样像效果…

Spring Boot 配置文件和日志

目录 配置文件格式 properties配置文件说明 1.properties基本语法 2.读取配置文件 3.properties缺点 yml配置文件说明 1.yml基本语法 2.配置不同数据类型 3.字符串特殊情况 4.配置对象 properties和yml对比 日志 日志的使用 日志级别 日志持久化 Lombok Lombo…

计算机网络课程设计-网络聊天程序的设计与实现

目录 前言 1 实验题目 2 实验目的 3 实验内容 3.1 客户端 3.1.1 步骤 3.1.2 关键代码 3.2 服务器 3.2.1 步骤 3.2.2 关键代码 4 实验结果与分析 5 代码 5.1 客户端 5.2 服务器 前言 本实验为计算机网络课程设计内容&#xff0c;基本上所有代码都是根据指导书给的附…

1.18寒假集训

A: 解题思路&#xff1a; 这题看似很复杂&#xff0c;其实很简单&#xff0c;找规律不难发现就是输出n 1 下面是c代码&#xff1a; #include<iostream> using namespace std; int main() {int n;cin >> n;cout << n 1;return 0; } B: 解题思路&#xf…

3dmax中怎么在模型上开洞?

3dmaxS是Autodesk公司开发的基于PC系统的三维动画渲染和制作软件。我们可以使用它来做各种模型。那么怎么在模型上开洞呢&#xff1f;我们一起来看看吧&#xff01; 1、首先我们打开我们的3damx&#xff0c;这里面我使用的版本为3damxs2012,虽然版本可能各不相同。但是功能并没…

【RT-DETR有效改进】轻量级视觉变换器RepViT改进特征提取网络(轻量化网络)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…

数据库MySQL----多表查询

二、多表查询 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); CREATE TABLE score ( id INT(10) NOT…

翻遍全网才找到的Oracle19c安装教程(Windows版)

一、下载 官方地址&#xff1a;Database Software Downloads | Oracle 中国 我下载下来了&#xff0c;有需要的可以网盘领取。 链接&#xff1a;https://pan.baidu.com/s/1-OeiuoBX3K4X7Kw7vGxdFA?pwdhssy 提取码&#xff1a;hssy 二、解压 下载下来是一个zip格式的压缩…