GoLang之搭建Web服务器

2023-10-29

2014-02-05 wcdj


0 摘要

之前总结过如何使用Perl搭建Web服务《Web服务器的实现(最小的Perl Web服务器)》。本文介绍如何使用GoLang搭建Web服务,Go语言提供了一个完善的net/http包,通过这个http包可以很方便搭建一个可以运行的Web服务,同时使用这个包能很简单地对Web的路由,静态文件,模板,Cookie等数据进行设置和操作。


1 测试代码一

http_svr.go

package main

import (
	"fmt"
	"log"
	"net/http"
	"strings"
)

func sayhelloName(w http.ResponseWriter, r *http.Request) {

	// 解析参数, 默认是不会解析的
	r.ParseForm()

	// 这些信息是输出到服务器端的打印信息
	fmt.Println("request map:", r.Form)
	fmt.Println("path", r.URL.Path)
	fmt.Println("scheme", r.URL.Scheme)
	fmt.Println(r.Form["url_long"])

	for k, v := range r.Form {
		fmt.Println("key:", k)
		fmt.Println("val:", strings.Join(v, ";"))
	}

	// 这个写入到w的信息是输出到客户端的
	fmt.Fprintf(w, "Hello gerryyang!\n")
}

func main() {

	// 设置访问的路由
	http.HandleFunc("/", sayhelloName)

	// 设置监听的端口
	err := http.ListenAndServe(":9090", nil)
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

2 测试用例一

(1) 在浏览器输入:http://localhost:9090/,则:

浏览器输出:

Hello gerryyang!

http_svr输出:

request map: map[]
path /
scheme
[]


(2) 在终端使用curl命令测试。

curl "http://localhost:9090/?url_long=111&url_long=222&name=gerryyang&gender=male" 

终端输出:

Hello gerryyang!

http_svr输出:

request map: map[url_long:[111 222] name:[gerryyang] gender:[male]]
path /
scheme
[111 222]
key: url_long
val: 111;222
key: name
val: gerryyang
key: gender
val: male


3 测试代码二

package main

import (
	"fmt"
	"net/http"
)

type MyMux struct {
}

func (p *MyMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path == "/" {
		sayhelloName(w, r)
		return
	}
	http.NotFound(w, r)
	return
}

func sayhelloName(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello gerryyang, version 2!\n")
}

func main() {
	mux := &MyMux{}
	http.ListenAndServe(":9090", mux)
}

4 测试用例二

gerryyang@mba:go_web$curl "http://localhost:9090/?url_long=111&url_long=222&name=gerryyang&gender=male"
Hello gerryyang, version 2!
gerryyang@mba:go_web$curl "http://localhost:9090/aa?url_long=111&url_long=222&name=gerryyang&gender=male"
404 page not found


5 小结

用例一,使用GoLang编写Web服务只要调用http包的两个函数,不依赖nginx,apache服务器。


6 原理分析

GoLang实现Web服务的流程如下:

(1) 创建Listen Socket,监听指定的端口,等待客户端(大黄鸭)请求到来;

(2) Listen Socket接受客户端的请求,得到Client Socket,接下来通过Client Socket与客户端通信;

(3) 处理客户端的请求,首先从Client Socket读取HTTP请求的协议头,如果是POST方法,还可能要读取客户端提交的数据,然后交给相应地handler处理请求,handler处理完毕准备好客户端需要的数据,通过Client Socket写给客户端;


7 参考

[1] Go Web编程





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GoLang之搭建Web服务器 的相关文章

  • 如何记录进入 IIS 的 HTTP 请求

    我在我的开发机器上运行 IIS 5 我有一个 asp net 3 5 Web 服务在其上运行 我从同一服务器上运行的不同 Web 应用程序调用该服务 我的服务返回错误 500 内部服务器错误 我正在对其进行故障排除 我的请求是通过Syste
  • 适用于 Objective-C / iPhone 的良好 HTTP 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 UPDATE 这个问题显然已经过时了 参见日期 我建议只使用现代 iOS7 功能 例如 NSURLSession 我想 这个问题是为了历史
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • android httprequest java.net.UnknownHostException

    我想用android发出http请求 是使用这个 void testHTTP HttpClient httpClient new DefaultHttpClient HttpUriRequest request new HttpPost h
  • 扩展(十进制,例如 400.1、401.4 等)HTTP 状态代码从何而来?

    我越来越多地看到十进制样式 HTTP 状态代码的激增 而且我似乎找不到任何 RFC 或其他 IETF 建议 甚至 W3C 草案或除 Microsoft IIS 文档之外的其他内容 请参阅https support microsoft com
  • 这个重写规则是什么意思?

    我正在安装 phpancake 有一个像这样的文件夹 application install library public sql schema install html install php 这条规则意味着什么 RewriteEngin
  • C# HTTP 请求解析器[重复]

    这个问题在这里已经有答案了 可能的重复 将原始 HTTP 请求转换为 HTTPWebRequest 对象 https stackoverflow com questions 318506 converting raw http reques
  • 使用.pem文件在java中发送https请求

    我有包含证书 私钥和信任链的 pem 文件 以及我使用它生成的 p12 文件openssl pkcs12 导出 openssl pkcs12 export out file p12 in file pem inkey file pem pa
  • Apache HttpClient TCP Keep-Alive(套接字保持活动)

    我的 http 请求需要太多时间才能被服务器处理 大约 5 分钟 由于连接闲置 5 分钟 代理服务器将关闭连接 我正在尝试在 Apache DefaultHttpClient 中使用 TCP Keep Alive 来使连接长时间处于活动状态
  • 为什么http使用CRLF作为行分隔符?

    据我所知 使用LF因为行分隔符非常流行 但我想知道为什么许多文本协议 如 HTTP FTP 使用CRLF作为它的行分隔符 我不认为这些协议是为旧打字机发明的 那么这有什么历史原因吗 我尝试通过谷歌 stackoverflow 和维基百科搜索
  • 如何防止 Firefox 缓存

    我尝试了很多可能的解决方案 但无法解决问题 这些不起作用 有人可以帮忙吗 我正在使用jsp servlet application 是websphere Portal 6 1 的一个portlet 切勿
  • 使用:text/plain; 有什么缺点吗?字符集=“UTF-8”

    我的网络服务器提供的内容在 95 的情况下只是简单的 ascii 但在极少数情况下 内容包含一些德语非 ASCII 字符 现在我可以设置content type通过检测内容是否包含任何非 ASCII 字符来响应标头 或者我可以始终设置响应标
  • 角度报告进度返回上传的文件总数,而不是进度

    在我的组件中我有这个 this authService addPost post subscribe data gt if data type HttpEventType UploadProgress console log data el
  • AngularJS 1.X 中的异步调用是如何工作的? $Http 调用没有返回值

    我有以下名为的函数getvalue 它与控制器一起位于 AngularJS 模块内 我试图在单击事件上调用此函数 调用控制器中的另一个函数 我希望我很清楚 功能 function getvalue Data http var value u
  • Android 套接字和 HTTP 响应标头

    有趣的是 我可能无意中找到了解决方案是否可以使用普通套接字连接发送 HTTP 请求并接收没有标头的响应 https stackoverflow com questions 8320574 我希望我忽略了一些东西 无论如何 我正在连接到 We
  • 如何用 C 语言通过 HTTP 协议发送图像?

    我是一名正在做网络服务器练习的学生 我需要一些帮助 我的网络服务器在文本页面上运行良好 但是每当浏览器发送一个 GET img jpg HTTP 1 1请求 我不知道如何处理 我听说 HTTP 协议是基于文本的 那么如何在 HTTP 响应中
  • Angular2:动态同步http请求

    Goal 发出一系列同步 http 请求并能够将它们作为一个可观察流进行订阅 示例 不工作 let query arr test1 test2 test3 function make request query arr if query a
  • Java 中的下载管理器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要通过 FTP HTTP 从 Java 获取几个大文件 几个演出 有现成的库 java 命令行工具
  • 使用 HTTP-Basic 身份验证发出 HTTP GET 请求

    我需要为我正在开发的 Flash Player 项目构建一个代理 我只需要使用 HTTP Basic 身份验证向另一个 URL 发出 HTTP GET 请求 并提供来自 PHP 的响应 就好像 PHP 文件是原始源一样 我怎样才能做到这一点
  • HTTPbis - bis 是什么意思?

    我经常看到 bis 附加到协议版本 例如 v 34bis 或 httpbis bis 是什么意思或代表什么 我认识的一位电信工程师认为它可能起源于法国 正如其他人已经说过的 bis 来自 两次 或 重复 http oxforddiction

随机推荐

  • [Java]生成32位随机字符ID

    生成32位编码 return string public static String getUUID String uuid UUID randomUUID toString trim replaceAll return uuid 自定义规
  • The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received

    我项目错误原因是项目里关于连接数据库有多个 properties文件 没有指定哪一个 就默认执行application properties了 而application properties是生产数据库 我连不上 我的解决办法是这样的在这里
  • Unity官方文档笔记(二)编辑器功能

    一 Preference 1 1 General 属性 功能 Auto Refresh 启用此设置可在资源更改时自动更新资源 Load Previous Project on Startup 启用此设置可在启动时始终加载上一个项目 Comp
  • 【译】在 React Hooks 中使用 useReducer 的几种用例

    原文 How to use useReducer in React Hooks for performance optimization github 的地址 欢迎 star React Hook 出来已经有一段时间了 具体的一些用法以及它
  • 如何确定自己是否适合做程序员?怎样知道自己到底喜不喜欢编程?将来要以此为工作?

    如何确定自己是否适合做程序员 怎样知道自己到底喜不喜欢编程 将来要以此为工作 程序员成长的必备条件 程序员的工作 说到底就是要编出满足需求的程序 如果这项工作你做得好 你就发展得好 所以 程序员的成长 都是围绕着 编出满足需求的程序来展开的
  • 关机对话框字体大小不跟随显示设置变化的修改

    现象描述 设置 显示 显示大小 最大 按电源键的关机 弹出确认框 android 12中原生去掉了关机确认对话框的的显示 但是客户头铁非要显示 询问MTK回答客制代码只能自己解决 只能自己搞定 贴了代码 仅供参考 在ShutdownThre
  • 普通文件下载 + 前端获取后端返回的文件流并下载

    参考资料 前端接受后端文件流并下载的几种方法 ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践 ajax请求二进制流进行处理 ajax异步下载文件 response setHeader 的
  • JavaScript的学习笔记

    JavaScript的学习笔记 学习B站上狂神的视频记录的笔记 1比较运算符 console log 1 1 true 判断的时候值相等 类型不同也是true console log 1 1 false 值相等且类型相同 才为true 2严
  • arcgis 字段计算器 条件赋值_ARCGIS中字段计算器的使用说明

    Field Calculator 工具可以在属性表字段点击右键 选择 Field Calculator 或者Data Management Tools gt fields gt Calculate Field打开 1 基本函数 针对数值型
  • 谷歌开发者工具之功能面板

    Network 面板 用的最多的面板 可查看 Ajax 请求 页面访问时间线等等 Performance 面板 查看JS性能 详情可看我的另一篇文章 如何使用谷歌浏览器开发者工具中的Performance分析网页性能 Rendering 面
  • 华为OD机试 - 恢复数字序列(Python)

    题目描述 对于一个连续正整数组成的序列 可以将其拼接成一个字符串 再将字符串里的部分字符打乱顺序 如序列8 9 10 11 12 拼接成的字符串为89101112 打乱一部分字符后得到90811211 原来的正整数10就被拆成了0和1 现给
  • C#中List常用方法:判断存在、查找、排序

    项目常用List来进行数据操作管理 有一些方法经常百度 所以这里记录下 目录 1 List判断元素是否存在 返回bool 2 List查找 返回对象 3 List排序 4 对象属性打印 5 List 其他方法 1 List判断元素是否存在
  • 程序员的自我修养——链接,装载与库

    章节目录 静态链接 编译和链接 目标文件 静态链接 windows COFF 装载和动态链接 可执行文件的装载与进程 动态链接 Linux共享库的组织 Windows下的动态链接 库与运行库 内存 运行库 系统调用与API 运行库实现 一
  • 【C++入门】引用符&详解

    1 C 的 引用符介绍 1 符号在C语言中表示取地址运算 2 C 对 符号进行拓展 符号新增了引用的用法 3 声明引用时 必须同时对其进行初始化 4 引用声明完毕后 相当于目标变量有两个名称 引用名就相当于变量的别名 操作引号名就相当于操作
  • 【深度解析→博文总结】李宏毅机器学习2023作业02Classification(Framewise Phoneme Prediction)

    文章目录 系列文章 简要说明 视频分享 作业详情 调参记录 Simple Baseline 0 49798 Medium Baseline 0 66440 Stong Baseline 0 74944 Boss Baseline 0 830
  • html制作电影界面,电影网站界面设计HTML_CSS模板

    实例简介 简单生活 希望对大家有用 要觉得本资源有价值请分享给您的朋友 生活就是人来人往 分享越多 收获越多 作者 天天ASP家园 实例截图 核心代码 7c828d9e b4a1 48fc be7b 81a2137edae2 电影网站界面设
  • ​​​​​​​三个案例帮你彻底了解反馈电路中的相位补偿

    转自于http www elecfans com d 669847 html 三个案例帮你彻底了解反馈电路中的相位补偿 2004年 帮朋友做镍氢充电器 利用镍氢电池充满电时电压有一个微小的下降这个特点来识别是否已经充满 比如1 2V的镍氢电
  • 程序员戴耳机究竟在听什么,看完真相,我惊了!

    今天 某妹子突然凑到我的耳边轻声说说 我们公司的程序员 清一色的戴着耳机 你说他们是不是故意不想听我们提的需求 我很方 因为我也喜欢戴耳机 思考ing 思考了一秒钟后 一本正经的和妹子说 你这么漂亮 怎么会呢 戴耳机可能只是他们的习惯罢了
  • String详解

    String类的理解 什么是String类 String类实现了Serializable接口 对象可以被序列化 序列化之后 对象可以进行网络传输 或者持久化 String类实现的Comparable接口 对象可以比较大小 String类实现
  • GoLang之搭建Web服务器

    2014 02 05 wcdj 0 摘要 之前总结过如何使用Perl搭建Web服务 Web服务器的实现 最小的Perl Web服务器 本文介绍如何使用GoLang搭建Web服务 Go语言提供了一个完善的net http包 通过这个http包