提示:本系列文章适合对Go有持续冲动的读者

初探golang web服务

golang web开发是其一项重要且有竞争力的应用,本小结来看看再golang中怎么创建一个简单的web服务。

在不适用web框架的情况下,可以使用net/http包搭建一个web服务。

  1. 这里我们使用net/http创建一个打印请求URL的web服务。
package main

import (
//"log"
"fmt"
"net/http"
) func main() {
http.HandleFunc("/", handler)
http.ListenAndServe("localhost:6677", nil) }
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "url.path=%q\n", r.URL.Path) //输出到文件流
}

http.HandleFunc函数可以理解为URL路由。

http.ListenAndServe是web服务的创建核心。

handler是http请求处理函数,接受一个http.ResponseWriter文件流 和http.Request类型的对象。

[root@VM-0-5-centos ~]# curl localhost:6677/123
url.path="/123"

  1. 我们通过handler函数来对访问url做访问数计算。

引入golang sync中的互斥锁,这样同时存在多个请求时只有一个goroutine改变count计数。互斥锁后续深入了解。

package main

import (
//"log"
"fmt"
"net/http"
"sync"
) var count int
var mutex sync.Mutex //使用互斥锁
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe("localhost:6677", nil) }
func handler(w http.ResponseWriter, r *http.Request) {
mutex.Lock()
count++
mutex.Unlock()
fmt.Fprintf(w, "request url.path:%q has %d times\n", r.URL.Path, count)
}

我们来看看请求结果如下:

[root@VM-0-5-centos ~]# curl localhost:6677/golang
request url.path:"/golang" has 1 times
[root@VM-0-5-centos ~]# curl localhost:6677/golang
request url.path:"/golang" has 2 times
[root@VM-0-5-centos ~]# curl localhost:6677/golang
request url.path:"/golang" has 3 times

  1. http.Request类型对象除了URL.Path属性外还有MethodProto等。我们通过handler函数分别打印出来。
package main

import (
//"log"
"fmt"
"net/http"
"sync"
) var count int
var mutex sync.Mutex //使用互斥锁
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe("localhost:6677", nil) }
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%s,%s,%s,\n", r.Method, r.URL, r.Proto)
fmt.Fprintf(w, "host:%q\nremoteaddr:%q\n", r.Host, r.RemoteAddr)
for k, v := range r.Header {
fmt.Fprintf(w, "Header[%q]:%q\n", k, v)
}
for k, v := range r.Form {
fmt.Fprintf(w, "Form[%q]:%q\n", k, v)
} }

创建表单接受后输出如下:

//output
GET,/helloweb,HTTP/1.1,
host:"localhost:6677"
remoteaddr:"127.0.0.1:58088"
Header["User-Agent"]:["curl/7.29.0"]
Header["Accept"]:["*/*"]
Form[parm1]:hello
Form[parm2]:web

本次简单的了解了一下golang web服务,也是初尝章节结束。接下来会比较深入的学习golang的精彩细节与精华。


文章有不足的地方欢迎在评论区指出。

欢迎收藏、点赞、提问。关注顶级饮水机管理员,除了管烧热水,有时还做点别的。

golang快速入门(五)初尝web服务的更多相关文章

  1. Golang快速入门

    Go语言简介: Golang 简称 Go,是一个开源的编程语言,Go是从2007年末由 Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian L ...

  2. 【servlet】Servlet快速入门&使用Eclipse发布web项目

    创建时间:6.15 1.什么是Servlet Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是ja ...

  3. golang快速入门(四)

    提示:本系列文章适合有其他语音基础并对Go有持续冲动的读者 一.golang获取HTTP请求 1.在golang标准库中提供了net包来处理网络连接,通过http.Get创建http请求并返回服务器响 ...

  4. Golang快速入门:从菜鸟变大佬

    最近写了不少Go代码,但是写着写着,还是容易忘,尤其是再写点Python代码后.所以找了一篇不错的Golang基础教程,翻译一下,时常看看. 原文链接: 「Learning Go - from zer ...

  5. HangFire快速入门 分布式后端作业调度框架服务

    安装 NuGet 上有几个可用的Hangfire 的软件包.如果在ASP.NET应用程序中安装HangFire,并使用Sql Server作为存储器,那么请在Package Manager Conso ...

  6. 初尝Web API《转》

    HTTP 并不是只能用在网页中.它其实还是一个强大的平台,可以用来生成一些API,暴露服务和数据.HTTP很简单灵活,还非常普及.几乎所有你能想到的平台都有HTTP库,所以HTTP服务可以囊括很大范围 ...

  7. webservice快速入门-使用wsimport生成ws服务端(二)

    上个例子演示的是在当前项目下发布的Webservice Server,而实际应用中和Client是分离的,本文介绍两种客户端开发方式: 1.导出WebService服务端服务接口到jar包,客户端引入 ...

  8. golang快速入门(练习)

    1.打包和工具链 1.1 包 所有 Go 语言的程序都会组织成若干组文件,每组文件被称为一个包. ? 1 2 3 4 5 6 7 8 9 10 net/http/     cgi/     cooki ...

  9. Dubbo快速入门 五

    5. Dubbo注解版 之前在dubbo配置文件显式编写内容提供者和消费者,官方还提供了了一种注解方式,接下来改造项目 1.服务提供方 dubbo配置文件 将之前手动申明注释掉,添加<dubbo ...

随机推荐

  1. 数栈运维实例:Oracle数据库运维场景下,智能运维如何落地生根?

    从马车到汽车是为了提升运输效率,而随着时代的发展,如今我们又希望用自动驾驶把驾驶员从开车这项体力劳动中解放出来,增加运行效率,同时也可减少交通事故发生率,这也是企业对于智能运维的诉求. 从人工运维到自 ...

  2. Kubernetes 普及系列:容器基础入门

    随着云原生时代的来临,云以及分布式计算已经是时下最受欢迎的技术之一了.其中 Docker 作为最知名的容器平台,到底有着怎样的魅力来让其无人不知无人不晓?废话不多说,让我们开始逐层掀开容器技术的神秘面 ...

  3. KMP算法:next和nextval值计算

    KMP算法的next和nextval值计算 先看看next数据值的求解方法 例:下标从1开始(若题中给定下标为0开始,把所有值-1即可) next数组的求解方法:根据前一个字符next,一直循环找到第 ...

  4. Dubbo学习笔记(二) Dubbo的基本配置

    Check启动检查 根据之前的学习,我们简单理解的Dubbo远程调用的基本流程,服务提供者注册到注册中心,然后服务消费者通过监听注册中心达到远程调用的目的,那么如果注册中心中没有消费者对应的接口会怎么 ...

  5. ubuntu 缺少动态依赖库

    起因 困扰我好久的一个报错,终于解决了 之前我一直以为是 python代码的问题,以为是模块相互调引起的报错,忽略了最后一行这个错误 OSError: libGCBase_gcc421_v3_0.so ...

  6. hdu 4309 最大流 + DFS

    题意:      给以三种有向边     (1) 隧道,可以过无数人,也可以藏c个人.     (2) 路,只能过人(流量INF).     (3)古桥,如果不修理可以过1个人,修理可以过无数个人,但 ...

  7. LA3415保守的老师

    题意:       有n个学生,老师要带他们出去玩,但是老师比较保守,怕他们之间萌生爱意,所以带出去的所有同学必须至少满足四个条件中的一组,问最多能带多少人出去玩. 思路:        比较简单二分 ...

  8. React-列表 & Key

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  9. Django(1)初识Django

    前言 Django是一个开放源代码的Web应用框架,由Python写成,最初用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站,即CMS(内容管理系统)软件,于2005年7月在BSD许可证下发布,这 ...

  10. 006-Java的访问权限控制符和包导入机制

    目录 一.Java的访问权限控制符 一.访问控制符的作用 二.访问控制符的分类 二.Java的包导入机制 一.为什么要使用package? 二.package怎么用? 三.对于带有package的ja ...