15分钟学 Go 第 26 天:基本的Web服务

第26天:基本的Web服务

学习目标

在这一节中,我们将学习如何创建一个简单的HTTP服务器。我们将介绍Go语言中的net/http包,具体实现一个基本的Web服务,同时理解HTTP请求和响应的基本概念。

1. Go的HTTP服务器概述

Go语言内置的net/http包使得构建Web服务变得迅速且简单。我们可以通过少量的代码实现一个功能齐全的HTTP服务器。以下是我们要实现的服务的基本功能:

  • 响应HTTP GET请求
  • 显示简单的文本消息
  • 可以在浏览器中访问

HTTP协议简要介绍

HTTP(超文本传输协议)是用于在Web上传输数据的协议。它使用请求-响应模型,客户端发送请求,服务器返回响应。常见的HTTP方法包括GET、POST、PUT和DELETE。

2. 创建一个简单的HTTP服务器

2.1 项目结构

首先,我们创建一个新的Go项目。目录结构如下:

/simple-http-server└── main.go

2.2 编写代码

下面是一个最简单的HTTP服务器代码示例:

package mainimport ("fmt""net/http"
)// handler 函数处理HTTP请求
func handler(w http.ResponseWriter, r *http.Request) {// 设置响应头w.Header().Set("Content-Type", "text/plain")// 向客户端写入内容fmt.Fprintf(w, "Hello, world! You requested: %s\n", r.URL.Path)
}func main() {// 定义处理器http.HandleFunc("/", handler)// 启动HTTP服务器fmt.Println("Starting server at :8080")if err := http.ListenAndServe(":8080", nil); err != nil {fmt.Println("Server failed to start:", err)}
}

2.3 代码讲解

  • package main:定义一个主包。
  • import:引入net/http和fmt包,前者用于处理HTTP请求,后者用于格式化I/O。
  • handler 函数:这个函数用来处理传入的HTTP请求。
    • w http.ResponseWriter:用于构建HTTP响应。
    • r *http.Request:表示接收到的请求。
  • main 函数
    • http.HandleFunc("/", handler):将根路径的请求路由到handler函数。
    • http.ListenAndServe(":8080", nil):在端口8080启动HTTP服务,第二个参数设为nil表示使用默认的多路复用器。

2.4 运行服务器

要运行这个代码,你可以在终端中导航到项目目录并运行:

go run main.go

然后在浏览器中访问 http://localhost:8080,你应该会看到:

Hello, world! You requested: /

3. 完整流程图

以下是HTTP请求和响应过程的简单流程图:

+---------------------+
|     Client (Browser)|
+---------------------+||  Send HTTP GET request|  (e.g., http://localhost:8080)v
+---------------------+
|   HTTP Server       |
|   (Go Application)  |
|                     |
|  Handle request     |
|   +---------------+ |
|   |  handler      | |
|   +---------------+ |
|       Generate     |
|       Response     |
|                    |
|  Send Response     |
|  (Hello, world!)   ||v
+---------------------+
|     Client (Browser)|
+---------------------+

4. 常见HTTP状态码

在创建Web服务时,了解HTTP状态码是非常重要的。以下是一些常见的状态码及其含义:

状态码含义
200OK
404Not Found
500Internal Server Error
301Moved Permanently
403Forbidden

5. 响应内容类型

在HTTP响应中,Content-Type头部字段告知客户端返回内容的类型。以下是一些常用的MIME类型:

MIME Type说明
text/htmlHTML文档
text/plain普通文本
application/jsonJSON格式
application/xmlXML文件

你可以在我们的代码中根据需要改变Content-Type

6. 增强功能:处理不同的路径

在本节,我们将如何在我们的HTTP服务器中处理不同的URL路径。

6.1 修改 handler 函数

func handler(w http.ResponseWriter, r *http.Request) {switch r.URL.Path {case "/":w.Header().Set("Content-Type", "text/plain")fmt.Fprintf(w, "Hello, world! You requested: %s\n", r.URL.Path)case "/about":w.Header().Set("Content-Type", "text/plain")fmt.Fprintf(w, "This is the About page.")default:w.WriteHeader(http.StatusNotFound) // 返回404状态码fmt.Fprintf(w, "404 page not found")}
}

6.2 测试不同的URL

  • 访问 / 会得到 “Hello, world!” 的响应。
  • 访问 /about 会得到关于页面的响应。
  • 访问未定义的路径将返回404错误。

7. 处理GET和POST请求

7.1 增加POST处理

我们可以扩展服务器来处理POST请求。示例代码如下:

func handler(w http.ResponseWriter, r *http.Request) {if r.Method == http.MethodPost {w.Header().Set("Content-Type", "text/plain")fmt.Fprintf(w, "Received a POST request!\n")return}// 处理其他请求switch r.URL.Path {case "/":// 处理GET请求w.Header().Set("Content-Type", "text/plain")fmt.Fprintf(w, "Hello, world! You requested: %s\n", r.URL.Path)case "/about":w.Header().Set("Content-Type", "text/plain")fmt.Fprintf(w, "This is the About page.")default:w.WriteHeader(http.StatusNotFound) // 返回404状态码fmt.Fprintf(w, "404 page not found")}
}

7.2 测试POST请求

可以使用工具如Postman或curl发送POST请求:

curl -X POST http://localhost:8080

响应将是:

Received a POST request!

8. 错误处理

在实际应用中,错误处理非常重要。我们可以改进代码逻辑以处理潜在的错误,例如无法启动服务器时的错误提示。

if err := http.ListenAndServe(":8080", nil); err != nil {log.Fatalf("Could not start server: %s\n", err)
}

日志记录

使用log包来记录错误和信息是提高应用可维护性的重要一环。

9. 总结

在这一节中,你学习了如何使用Go构建一个简单的HTTP服务器。你掌握了基本的HTTP请求处理,如何定义路由,并能够处理GET和POST请求。了解HTTP协议及状态码也是实现Web服务的重要知识。

10. 下一步

在后续的学习中,我们将探索以下内容:

  • 使用第三方路由库(如gorilla/mux)
  • 实现中间件
  • 处理JSON数据
  • 构建RESTful API

怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

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

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

相关文章

Linux·进程间通讯(管道)

从本节开始将使用vscode写代码,语言也切换成C,同时OS从centOS换成ubentu。 进程之间可能存在数据传输、资源共享、通知事件、进程控制等需求,但是进程又具有独立性,所以就需要专门的进程间通讯技术(ipc)来满足需求。进程间通讯(IP…

人工智能与伦理:我们应该如何平衡科技与人性?

内容概要 在这个瞬息万变的时代,人工智能的迅猛发展让我们面对前所未有的伦理困境。科技进步带来了便利,但同时也亟需我们反思如何对待人性。尤其是在实现算法透明性时,我们要确保每一个决策背后都能被理解与追溯,这不仅是对技术…

云服务器排查微信支付接口异常

1.官方文章 网络云排查工具安装方法 - 腾讯客服 2.官方文章 网络云排查工具使用常见场景以及排查方法 - 腾讯客服 3.商户平台查看 网络波动和实际接口日志出问题时间对照

前端内存空间(堆、栈、队列、拷贝、垃圾回收)

在了解前端内存空间前,我们先学习三种基本数据结构:堆、栈、队列。 栈 栈是一种线性的数据结构,它遵循后进先出(LIFO)的原则。栈的特点是只能在栈顶进行插入和删除操作,因此栈的底部是栈中的最小值。 栈是…

浮动+flex布局

一.浮动 1.介绍 2.效果 <style> .one{ width: 100px; height: 100px; background-color: red; float: left; } .two{ width: 200px; height: 200px; background-color: blue; float: right; } </style> </head> <body> <div class"one&quo…

安全日志记录的重要性

1024程序员节不仅是对技术的庆祝&#xff0c;也是我们审视自己工作中责任的重要时刻。在现代信息安全体系中&#xff0c;安全日志记录是最关键的环节之一。它不仅能帮助企业或开发者及时发现安全威胁&#xff0c;还能在事后追踪攻击源、分析事件并采取补救措施。因此&#xff0…

架构师备考-系统分析与设计(结构化方法)

定义 1978年&#xff0c;E.Yourdon 和 L.L.Constantine 提出了结构化方法&#xff0c;即 SASD 方法&#xff0c;也可称为面向功能的软件开发方法或面向数据流的软件开发方法。Yourdon 方法是20世纪80年代使用最广泛的软件开发方法。 结构化方法提出了一组提高软件结构合…

正点原子阿尔法ARM开发板-IMX6ULL(十二)——驱动开发的简单介绍

文章目录 一、前言二、Linux驱动开发思维三、驱动开发分类四、应用程序和驱动的交互原理五、字符设备驱动开发流程 一、前言 也终于是到了这个最是激动人心的时刻了&#xff0c;那个也是从本科&#xff0c;就听说过的词汇&#xff0c;非常的让人神往&#xff0c;这个词对我而言…

人工智能原理实验二:搜索方法

一、实验目的 本实验课程是计算机、智能、物联网等专业学生的一门专业课程&#xff0c;通过实验&#xff0c;帮助学生更好地掌握人工智能相关概念、技术、原理、应用等&#xff1b;通过实验提高学生编写实验报告、总结实验结果的能力&#xff1b;使学生对智能程序、智能算法等…

Chromium 中chrome.fontSettings扩展接口定义c++

一、chrome.fontSettings 使用 chrome.fontSettings API 管理 Chrome 的字体设置。 权限 fontSettings 要使用 Font Settings API&#xff0c;您必须在扩展程序中声明 "fontSettings" 权限 清单。例如&#xff1a; {"name": "My Font Settings E…

npm install | npm ERR! Incorrect or missing password.

前端项目更新&#xff0c;执行npm install 安装依赖的时候&#xff0c;经常会出现一些莫名奇妙的问题&#xff0c;其中由于开发在本地编写的时候&#xff0c;可能会引用一些私有包&#xff0c;部署到服务器时就会出现问题&#xff0c;下面是排查过程。 npm ERR! code E401 npm …

C++——写一函数,将一个3x3的整型矩阵转置。用指针或引用方法处理。

没注释的源代码 #include <iostream> using namespace std; void move(int *p); int main() { int a[3][3],*p; cout<<"please input matrix:"<<endl; for(int i0;i<3;i) { for(int j0;j<3;j) { …

React + SpreadJS 开发时常见问题

在使用React与SpreadJS进行开发时&#xff0c;可能会遇到各种各样的问题。以下是一些常见的问题及其解决建议&#xff1a; 1. SpreadJS初始化失败 问题描述&#xff1a; 有时候SpreadJS的初始化可能会失败&#xff0c;特别是在React组件的生命周期内不当的初始化时机。 解决…

【AI应用】大模型工具如何助力文字创意工作(提示词Prompt+谷歌NotebookLM)

出发点&#xff1a;身处信息碎片和过载的时代&#xff0c;如何在日常工作学习中汇总并高效梳理知识&#xff1f;普通用户又如何激发AI大模型产出高质量的结果呢&#xff1f;本文将给出这两个问题的一些解决思路。 0、提纲&#xff1a; 提示词工程应知应会NotebookLM惊艳登场总…

springboot 使用 weixin-java-pay 支付demo

springboot引入依赖 <dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-pay</artifactId><version>4.6.0</version></dependency>配置 wx:pay:appId: *********mchId: ********apiV3Key: ******…

数据安全-接口数据混合加密笔记

接口数据传输安全设计方案 采用非对称加密对称加密混合方式&#xff0c;接口混合加、解密过程梳理&#xff1a; 后端准备sm2公钥和私钥后端将SM2公钥传输到前端前端生成SM4密钥前端使用SM2公钥加密SM4秘钥&#xff0c;获得密文使用SM4秘钥加密数据将密文和加密数据传输至后端…

深入 Prometheus 监控生态 - 第六篇:与 Grafana 实现系统全面监控(健康状态和任务状态看板)

文章目录 前言部署 Grafana 和连接 Prometheus 数据源简单部署 Grafana 构建系统监控看板1. 监控信息查看2. 看板制作&#xff08;表格图&#xff09;配置表格图&#xff08;Line Chart&#xff09; 配置告警规则与通知1. Prometheus 中的告警规则2. Grafana 告警配置&#xff…

剧本杀门店预约小程序,在线一键预约体验

剧本杀作为集社交、角色扮演、休闲娱乐为一体的游戏&#xff0c;吸引了年轻人的目光。当下&#xff0c;随着市场的发展&#xff0c;剧本杀行业正面临挑战&#xff0c;对于门店来说&#xff0c;如何找到新的发展方向&#xff0c;在市场中脱颖而出是重中之重&#xff01; 线上线…

Python自动化数据备份与同步

在日常运维工作中&#xff0c;定期备份重要数据是确保业务连续性和数据安全的关键步骤。本文将介绍如何使用Python的shutil库来复制文件和目录&#xff0c;并结合schedule库实现定时执行备份任务的功能。 1. 环境准备 首先&#xff0c;我们需要安装schedule库&#xff0c;这个…

使用Html5基本标签实现“时空电影网”案例步骤及详细代码

根据您的需求&#xff0c;我为您实现了对“时空电影网”电影节页面的美化。以下是详细的步骤&#xff1a; 设置一级标题“电影节”文字的颜色&#xff1a;将一级标题的颜色设置为深蓝色&#xff08;#0000FF&#xff09;。 <h1><font color"darkblue">电…