Golang: 创建Web服务
使用 Go 语言,我们可以轻松创建出 Web 服务,这一点比 Node.js 还要简单,今天就来总结一下 Go 语言中 Web 服务的创建方式。
首先,我们需要引入 net/http 这个包来处理 HTTP 请求,然后在指定的端口开启服务,下面来写一个最简单的 Web 服务程序:
// server.go
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", handler)
log.Println("go server listening at port 3000...")
err := http.ListenAndServe(":3000", nil)
if err != nil {
log.Fatal("err: ", err)
}
}
func handler(res http.ResponseWriter, req *http.Request) {
log.Println(req.URL.Path)
fmt.Fprintf(res, "URL.Path = %q\n", req.URL.Path)
}
上面代码中,我们会处理所有 3000 端口的请求,然后在页面显示请求的路径。另外,我们在代码中引入了 log 包,使用 log.Println(s) 方法打印信息,运行代码后,在浏览器请求 localhost:3000 及 localhost:3000/test,控制台打印信息如下:
$ go run server.go
2018/08/30 13:26:58 go server listening at port 3000...
2018/08/30 13:27:01 /
2018/08/30 13:27:07 /test
接下来,我们希望这个服务能够解析出浏览器的请求信息,返回并显示到页面,下面是经过改进后的代码:
// server.go
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", handler)
log.Println("go server listening at port 3000...")
err := http.ListenAndServe(":3000", nil)
if err != nil {
log.Fatal("err: ", err)
}
}
func handler(res http.ResponseWriter, req *http.Request) {
// 请求方法 请求地址 协议类型
fmt.Fprintf(res, "%s %s %s\n", req.Method, req.URL, req.Proto)
// 请求头信息
for k, v := range req.Header {
fmt.Fprintf(res, "Header[%q] = %q\n", k, v)
}
// 请求的服务器URL & 请求的远程地址
fmt.Fprintf(res, "Host = %q\n", req.Host)
fmt.Fprintf(res, "RemoteAddr = %q\n", req.RemoteAddr)
if err := req.ParseForm(); err != nil {
log.Print(err)
}
// 表单信息
for k, v := range req.Form {
fmt.Fprintf(res, "Form[%q] = %q\n", k, v)
}
}
在 handler 函数中,我们从 http.Request 中取出相应的 HTTP 请求信息,然后返回给浏览器,大家可以亲自运行以上代码,来观察实际效果。
接下来,我们希望做个小功能 - 统计用户的访问次数,这是一项很古老的技术了,在上个世纪的论坛网站中曾广泛应用。
Golang: 创建Web服务的更多相关文章
- Webservices-2.C#创建web服务,及引用访问、代码访问
注:web服务简介Webservices-1.web服务定义简介 以下均以C#语言为例 一.创建web服务(简单介绍,主要讨论客户端引用) 打开VS创建网站项目,在网站项目中添加“WEB服务(ASMX ...
- http-server让你在任何目录下都可以创建web服务
在做前端页面开发,或者预览时,如果借助于Apache.Tomcat.nginx等预览页面,每次需要将所需预览的页面移动到对应的文件夹下,且还需要考虑是否删除相关目录原有的文件,显然比较麻烦. 那么有没 ...
- 手把手教你在.NET中创建Web服务
最近发现在.NET平台下使用Web服务还是很简单的.下面举个在.NET平台下创建Web服务的简单例子.首先用Visul Studio .Net创建一个C# 项目Asp.Net Web服务程序,源代码如 ...
- 基于Socket创建Web服务
基于Socket创建Web服务 为什么要使用Socket呢,我们来看下图
- Web Service 实例基于Socket创建Web服务
ServerSocket服务器端代码如下: public static void main(String[] args) throws IOException { // 1:建立服务器端的tcp so ...
- ASP.NET---如何使用web api创建web服务
1 首先创建asp.net web空项目,并且创建模拟数据,我在工程下面创建了一个Models文件夹,在文件夹Nodels下面创建类Product和Repository 具体如下: [Serializ ...
- 使用BPEL创建Web服务组合
http://www.cnblogs.com/ahhuiyang/archive/2012/12/18/2824131.html 为简单起见,本例的Web服务组合只调用一个Web Service AP ...
- 使用Golang搭建web服务
如何用golang搭建一个web服务呢?菜鸟官网的go web编程教程已经介绍了web服务器的工作原理,这里就不赘述了. 我们先看个例子:http.go package main import ( & ...
- asyncio创建协程解析——分析廖雪峰的Python教程之创建WEB服务(转)
第一步,搭建开发环境 所需第三方库: aiohttp,异步 Web 开发框架:jinja2,前端模板引擎:aiomysql,异步 mysql 数据库驱动 所需内置库: logging,系统日志:asy ...
随机推荐
- set(集合)的使用方法
1.普通集合set 直接定义一个set具有动态有序和去重的功效,不再赘述. 如果要实现set时从大到小排序(desc)的,只需要在定义的时候指定“大于符号”,即greater<class> ...
- 论OIer的同构
定义一个输入集,指这样一个集合:由任意存在于物理世界的OI题目以及做这个题的时间与身体状态等各种元素组成的n元组组成的集合 OIer被定义为一个二元组:<"结果集",&quo ...
- 【BZOJ3711】Druzyny
[BZOJ3711]Druzyny 题面 bzoj 题解 首先我们有一个\(O(n^2)\)的\(dp\): 设\(f_i\)表示现在已经分好了\(1...i\)的组,且\(i\)作为一组的结尾的最大 ...
- java web开发入门二(struts)基于eclispe
JavaBean JavaBean, 咖啡豆. JavaBean是一种开发规范,可以说是一种技术. JavaBean就是一个普通的java类.只有符合以下规定才能称之为javabean: 1)必须提 ...
- mysql 主从 数据不一致
用pt-table-checksum校验数据一致性 Jun 4th, 2013 主从数据的一致性校验是个头疼的问题,偶尔被业务投诉主从数据不一致,或者几个从库之间的 数据不一致,这会令人沮丧.通常我们 ...
- Finalizer 导致的OOM
本文介绍的是Java里一个内建的概念,Finalizer.你可能对它对数家珍,但也可能从未听闻过,这得看你有没有花时间完整地看过一遍java.lang.Object类了.在java.lang.Obje ...
- c# 枚举类型怎么用?
有很多将枚举类型的都没有说详细...所以我这里贴出来一下,免得我忘记.................................. using System; using System.Coll ...
- flume参数解析+启动参数解析
flume参数: #example.conf:单节点Flume配置 #命名此代理上的组件 a1.sources = r1 a1.sinks = k1 a1.channels = c1 #描述/配置源 ...
- C++动态规划实现查找最长公共子序列
问题描述: 给定两个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列.(给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共 ...
- c++11多线程记录0
两种并发编程模型 多进程 进程间通信常用的几种方式: 文件 管道 消息队列 多线程 一个进程中存在的多个线程,通常通过共享内存来通信,(说的非常非常粗俗,就是通过类似"全局变量"的 ...