18.1 HTTP服务器-极简服务器、请求与响应

1. 极简服务器

大道至简。使用Go语言构建世界上最简单HTTP服务器,仅需四行代码。

标准库的net/http包提供了多种用于创建HTTP服务器的方法,其中包括:

  • http.HandleFunc("/", rootHandler)

第一参数:访问的url

第二参数:处理请求的函数创建路由,为不同的访问路径指定不同的处理函数

  • http.ListenAndServe(":8000", nil)
    • 启动服务,侦听给定的通信端口

针对给定访问路径的处理函数需要自己实现,该函数形如:

  • func rootHandler(w http.ResponseWriter, r *http.Request) {
  •         w.Write([]byte("Hello World!"))
  • }
  • 该函数必然包括两个参数http.ResponseWriter*http.Request
  • 该函数的两个参数一个代表响应,即用于构造响应包的写入器,用于写入返回给浏览器的信息;另一个则代表请求。
  • 该函数的核心任务就是根据请求中的各种输入数据,进行业务处理,产生响应输出。
// 最简单的HTTP服务器
// 标准库的net/http包提供了多种创建HTTP服务器的方法,它还提供了一个基本的路由器 
package main

import "net/http"

func rootHandler(w http.ResponseWriter,	// 定义路由处理函数
    r *http.Request) {
    w.Write([]byte("Hello World!"))
}

func main() {
    http.HandleFunc("/", rootHandler)	// web资源访问地址为 "资源根路径/"
    http.ListenAndServe(":8000", nil)
}

 2.请求与响应

(一)使用curl发送请求:

除了通过浏览器向HTTP服务器发起请求并接收响应以外,还可以使用更专业化的工具,比如curl来查看往返于客户端和服务器之间请求响应数据包

Linux和macOS操作系统通常都预先安装了curl工具,Windows操作系统虽然没有预先安装,但可以从这里免费下载并安装:

  • https://curl.haxx.se/windows

curl安装好以后,就可以在开发HTTP服务器时,用它做客户端向服务器发送各种请求,并查看服务器的响应。

  • 首先启动前面编写的"极简服务器"程序。
    • go run main.go
  • 打开终端或命令提示符窗口,输入如下命令:
    • curl -is "http://localhost:8000"
    • 选项-is指定打印包头,并忽略一些次要信息
  • 如果命令执行成功,将看到来自HTTP服务器的响应,其中包含响应头响应体。

服务器返回的响应头包含了如下信息:

  • HTTP/1.1 200 OK //协议状态码状态描述
  • Date: Sat, 29 Dec 2018 06:28:05 GMT //发送响应的日期和时间(格林威治时间)
  • Content-Length: 12 //内容长度共12个字节
  • Content-Type: text/plain; charset=utf-8 //内容类型为使用UTF-8编码的纯文本

服务器返回的响应体包含了如下信息:

  • Hello World! //由12字节UTF-8编码纯文本构成的响应内容

(二)路由 

HandleFunc函数用于注册响应给定URL地址映射的处理函数。

  • http.HandleFunc("/", rootHandler)
  • http.HandleFunc("/users/", usersHandler)
  • http.HandleFunc("/projects/", projectsHandler)

服务器依据如下路由规则,将对特定URL地址的访问路由到相应的处理函数

  • URL地址必须完全匹配,包括大小写和斜杠。
    • 对"/projects"的访问,不会被路由到与"/projects/"相对应的处理函数projectsHandler。
  • 如果找不到严格匹配的URL地址,则一律按"/"处理,因此"/"也被称为缺省路由。
  • 路由与请求类型无关,只负责调用与URL地址相对应的函数。
    • 对每一种请求类型(GET、POST、PUT、DELETE等)的具体处理在处理函数的内部实现。

附录:CURL命令相关参数

// 附录:CURL命令的相关参数,具体使用实例不做赘述。
-a/--append 上传文件时,附加到目标文件  
 -A/--user-agent <string>  设置用户代理发送给服务器  
 - anyauth   可以使用“任何”身份验证方法  
 -b/--cookie <name=string/file> cookie字符串或文件读取位置  
 - basic 使用HTTP基本验证  
 -B/--use-ascii 使用ASCII /文本传输  
 -c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中  
 -C/--continue-at <offset>  断点续转  
 -d/--data <data>   HTTP POST方式传送数据  
 --data-ascii <data>  以ascii的方式post数据  
 --data-binary <data> 以二进制的方式post数据  
 --negotiate     使用HTTP身份验证  
 --digest        使用数字身份验证  
 --disable-eprt  禁止使用EPRT或LPRT  
 --disable-epsv  禁止使用EPSV  
 -D/--dump-header <file> 把header信息写入到该文件中  
 --egd-file <file> 为随机数据(SSL)设置EGD socket路径  
 --tcp-nodelay   使用TCP_NODELAY选项  
 -e/--referer 来源网址  
 -E/--cert <cert[:passwd]> 客户端证书文件和密码 (SSL)  
 --cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)  
 --key <key>     私钥文件名 (SSL)  
 --key-type <type> 私钥文件类型 (DER/PEM/ENG) (SSL)  
 --pass  <pass>  私钥密码 (SSL)  
 --engine <eng>  加密引擎使用 (SSL). "--engine list" for list  
 --cacert <file> CA证书 (SSL)  
 --capath <directory> CA目录 (made using c_rehash) to verify peer against (SSL)  
 --ciphers <list>  SSL密码  
 --compressed    要求返回是压缩的形势 (using deflate or gzip)  
 --connect-timeout <seconds> 设置最大请求时间  
 --create-dirs   建立本地目录的目录层次结构  
 --crlf          上传是把LF转变成CRLF  
 -f/--fail          连接失败时不显示http错误  
 --ftp-create-dirs 如果远程目录不存在,创建远程目录  
 --ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用  
 --ftp-pasv      使用 PASV/EPSV 代替端口  
 --ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址  
 --ftp-ssl       尝试用 SSL/TLS 来进行ftp数据传输  
 --ftp-ssl-reqd  要求用 SSL/TLS 来进行ftp数据传输  
 -F/--form <name=content> 模拟http表单提交数据  
 -form-string <name=string> 模拟http表单提交数据  
 -g/--globoff 禁用网址序列和范围使用{}和[]  
 -G/--get 以get的方式来发送数据  
 -h/--help 帮助  
 -H/--header <line>自定义头信息传递给服务器  
 --ignore-content-length  忽略的HTTP头信息的长度  
 -i/--include 输出时包括protocol头信息  
 -I/--head  只显示文档信息  
 从文件中读取-j/--junk-session-cookies忽略会话Cookie  
 - 界面<interface>指定网络接口/地址使用  
 - krb4 <级别>启用与指定的安全级别krb4  
 -j/--junk-session-cookies 读取文件进忽略session cookie  
 --interface <interface> 使用指定网络接口/地址  
 --krb4 <level>  使用指定安全级别的krb4  
 -k/--insecure 允许不使用证书到SSL站点  
 -K/--config  指定的配置文件读取  
 -l/--list-only 列出ftp目录下的文件名称  
 --limit-rate <rate> 设置传输速度  
 --local-port<NUM> 强制使用本地端口号  
 -m/--max-time <seconds> 设置最大传输时间  
 --max-redirs <num> 设置最大读取的目录数  
 --max-filesize <bytes> 设置最大下载的文件总量  
 -M/--manual  显示全手动  
 -n/--netrc 从netrc文件中读取用户名和密码  
 --netrc-optional 使用 .netrc 或者 URL来覆盖-n  
 --ntlm          使用 HTTP NTLM 身份验证  
 -N/--no-buffer 禁用缓冲输出  
 -o/--output 把输出写到该文件中  
 -O/--remote-name 把输出写到该文件中,保留远程文件的文件名  
 -p/--proxytunnel   使用HTTP代理  
 --proxy-anyauth 选择任一代理身份验证方法  
 --proxy-basic   在代理上使用基本身份验证  
 --proxy-digest  在代理上使用数字身份验证  
 --proxy-ntlm    在代理上使用ntlm身份验证  
 -P/--ftp-port <address> 使用端口地址,而不是使用PASV  
 -Q/--quote <cmd>文件传输前,发送命令到服务器  
 -r/--range <range>检索来自HTTP/1.1或FTP服务器字节范围  
 --range-file 读取(SSL)的随机文件  
 -R/--remote-time   在本地生成文件时,保留远程文件时间  
 --retry <num>   传输出现问题时,重试的次数  
 --retry-delay <seconds>  传输出现问题时,设置重试间隔时间  
 --retry-max-time <seconds> 传输出现问题时,设置最大重试时间  
 -s/--silent静音模式。不输出任何东西  
 -S/--show-error   显示错误  
 --socks4 <host[:port]> 用socks4代理给定主机和端口  
 --socks5 <host[:port]> 用socks5代理给定主机和端口  
 --stderr <file>  
 -t/--telnet-option <OPT=val> Telnet选项设置  
 --trace <file>  对指定文件进行debug  
 --trace-ascii <file> Like --跟踪但没有hex输出  
 --trace-time    跟踪/详细输出时,添加时间戳  
 -T/--upload-file <file> 上传文件  
 --url <URL>     Spet URL to work with  
 -u/--user <user[:password]>设置服务器的用户和密码  
 -U/--proxy-user <user[:password]>设置代理用户名和密码  
 -v/--verbose  
 -V/--version 显示版本信息  
 -w/--write-out [format]什么输出完成后  
 -x/--proxy <host[:port]>在给定的端口上使用HTTP代理  
 -X/--request <command>指定什么命令  
 -y/--speed-time 放弃限速所要的时间。默认为30  
 -Y/--speed-limit 停止传输速度的限制,速度时间'秒  
 -z/--time-cond  传送时间设置  
 -0/--http1.0  使用HTTP 1.0  
 -1/--tlsv1  使用TLSv1(SSL)  
 -2/--sslv2 使用SSLv2的(SSL)  
 -3/--sslv3         使用的SSLv3(SSL)  
 --3p-quote      like -Q for the source URL for 3rd party transfer  
 --3p-url        使用url,进行第三方传送  
 --3p-user       使用用户名和密码,进行第三方传送  
 -4/--ipv4   使用IP4  
 -6/--ipv6   使用IP6  
 -#/--progress-bar 用进度条显示当前的传送状态

 

 

 

 

 

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

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

相关文章

Elasticsearch搜索引擎(高级篇)

3.1 查询语法 | 《ElasticSearch入门到实战》电子书 (chaosopen.cn) day09-Elasticsearch02 - 飞书云文档 (feishu.cn) 目录 第一章 DSL查询 1.1 基本语法 1.2 叶子查询 全文检索查询 精确查询 1.3 复合查询 算分函数查询 bool查询 1.4 排序 1.5 分页 基础分页 深度分…

数据可视化:Seaborn

安装Seaborn 进入虚拟环境&#xff0c;在终端中键入 pip install seaborn 即可安装。 初步使用Seaborn 在使用seaborn之前&#xff0c;我们先了解一下seaborn是什么&#xff0c;seaborn是以matplotlib为底层的更简便的python第三方库&#xff0c;它可以更快捷地去设置图形的一…

Web应用安全测试-防护功能缺失

Web应用安全测试-防护功能缺失 1、Cookie属性问题 漏洞描述&#xff1a; Cookie属性缺乏相关的安全属性&#xff0c;如Secure属性、HttpOnly属性、Domain属性、Path属性、Expires属性等。 测试方法&#xff1a; 通过用web扫描工具进行对网站的扫描&#xff0c;如果存在相关…

快速提升沟通能力:客服必备的话术技巧

在现在的这个互联网时代&#xff0c;各行业竞争日益激烈&#xff0c;而客服作为连接商家和消费者的桥梁&#xff0c;无疑是一个重要的岗位。可以说客服是一个极具挑战性的岗位&#xff0c;客服每天需要面对来自全国各地的客户&#xff0c;同时还要对不同地区、不同性格、不同需…

Unity资源 之 最受欢迎的三消游戏开发包 - Bubble Shooter Kit 【免费领取】

三消游戏开发包 - Bubble Shooter Kit 免费领取 前言资源包内容领取兑换码 前言 如果你是一名 Unity 游戏开发者&#xff0c;并且正在寻找一种快速、简单的方式来创建自己的三消游戏&#xff0c;那么 Bubble Shooter Kit 就是你所需要的。 资源包内容 Bubble Shooter Kit 是…

推荐系统三十六式学习笔记:原理篇.矩阵分解10|那些在Netflix Prize中大放异彩的推荐算法

目录 缘起矩阵分解为什么要矩阵分解1 基础的SVD算法2 增加偏置信息3 增加历史行为4 考虑时间因素 总结 我们先前聊过推荐系统中的经典问题&#xff0c;其中有一类就是评分预测。平心而论&#xff0c;评分预测问题只是很典型&#xff0c;其实并不大众。毕竟在实际的应用中&#…

使用Omnipeek进行Wifi/P2P抓包

前言 工作中解决Mirracast投屏连接失败的问题时&#xff0c;遇到了需要抓取wifi数据包的情况&#xff0c;记录一下配置和使用过程。 一、Omnipeek 的安装和配置 1.1 Omnipeek 安装 双击 setup.exe 进行安装 1.2 注册 注册时&#xff0c;版本写 71 &#xff0c;产生序列号和…

Leetcode刷题笔记10

14. 最长公共前缀 14. 最长公共前缀 - 力扣&#xff08;LeetCode&#xff09; 首先&#xff0c;检查边界条件 如果输入的字符串数组为空&#xff0c;直接返回空字符串。 然后使用minmax_element函数找到数组中字典序最小和最大的字符串。 因为公共前缀一定会出现在字典序最…

爬虫相关面试题(其二)

十一 分布式爬虫爬虫原理 一个分布式爬虫&#xff0c;是需要有一个或多个发任务的程序&#xff0c;提取将来需要的任务&#xff0c;主要指的就是任务链接&#xff0c;存到任务队列&#xff08;redis数据库中&#xff09;&#xff0c;还需要多个执行任务的程序&#xff0c;从任…

微软无所不知的人工智能召回功能“Recall”被推迟,将不会与 Copilot Plus PC 一起提供

微软计划下周推出新的 Copilot Plus 个人电脑&#xff0c;取消其备受争议的 Recall 功能&#xff0c;该功能可以截取您在这些新笔记本电脑上所做的所有操作。该软件制造商推迟了 Recall&#xff0c;以便可以通过 Windows Insider 程序对其进行测试&#xff0c;此前该公司最初承…

解决CentOS的yum命令失效的问题

近日笔者对一台装有 CentOS 7.9 系统的服务器反复折腾&#xff0c;玩到最后发现 yum 命令用不了&#xff0c;总是报下面的错误信息&#xff1a; There was a problem importing one of the Python modules required to run yum. The error leading to this problem was:/usr/l…

eclipse如何导入springboot项目

打开eclipse 找到你的springboot项目 点击finish即可 test02就已经导入进去了 配置一下maven 在将那个springboot项目刷新一下即可 运行成功

服务器数据恢复—vxfs文件系统元数据被破坏的数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌MSA2000服务器存储中有一组由8块SAS硬盘组建的raid5磁盘阵列&#xff0c;其中包含一块热备盘。分配了6个LUN&#xff0c;均分配给HP-Unix小机使用。磁盘分区由LVM进行管理&#xff0c;存放的数据主要为Oracle数据库及OA服务端。 服务…

企业数据放到公有云上安全吗?

将企业数据放置在公有云上是否安全&#xff0c;取决于多种因素&#xff0c;包括所选择的云服务提供商、数据类型、行业合规要求、以及企业本身的安全策略和实践。下面是一些关键点&#xff0c;可以帮助理解公有云上的数据安全性&#xff1a; 公有云提供商的安全措施 物理安全与…

【PL理论】(23) 函数式语言:let-in 示例的分解 | 谁在使用动态作用域?

&#x1f4ad; 写在前面&#xff1a;本章我们将对函数式语言的讲解进行收尾&#xff0c;分解一下之前讲的 let-in 示例。然后讨论一下谁在使用动态作用域。 目录 0x00 let-in 示例的分解 0x01 谁使用动态作用域&#xff1f; 0x00 let-in 示例的分解 让我们详细检查这个示例…

vue.js+node.js+mysql在线聊天室源码

vue.jsnode.jsmysql在线聊天室源码 技术栈&#xff1a;vue.jsElement UInode.jssocket.iomysql vue.jsnode.jsmysql在线聊天室源码

建议收藏!亚马逊卖家必须知道的37个常用术语解释

运营亚马逊&#xff0c;经常会看到很多个专业术语&#xff0c;想必大部分新手卖家都比较陌生&#xff0c;熟悉这些常用术语的含义有助于你更好地运营亚马逊。下面为各位整理了37个在亚马逊跨境电商中常见的术语及其解释&#xff0c;建议收藏&#xff01; 1、SKU Stock Keeping…

揭秘数据资产的核心价值:从数据收集到分析应用的全方位解决方案,引领企业驶向智能化未来

一、引言 在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业最重要的资产之一。从海量的数据中提取有价值的信息&#xff0c;转化为企业的竞争优势&#xff0c;是每一家企业都面临的挑战和机遇。本文将深入探讨数据资产的核心价值&#xff0c;以及如何通过从数据收集到分…

Ubuntu18.04 安装 colmap

安装依赖 sudo apt-get install \git \cmake \ninja-build \build-essential \libboost-program-options-dev \libboost-filesystem-dev \libboost-graph-dev \libboost-system-dev \libeigen3-dev \libflann-dev \libfreeimage-dev \libmetis-dev \libgoogle-glog-dev \libgt…

搭建 Redis 集群【Windows】

Redis 集群是一个分布式存储解决方案&#xff0c;它将数据分布在多个Redis节点上&#xff0c;以提高系统的可伸缩性、可靠性和性能。 1. 集群概念与特点 集群概念&#xff1a;Redis集群是由多个相互独立的 Redis 节点组成&#xff0c;这些节点通过高速网络互联&#xff0c;并作…