【go】http实验
实验1:上手篇
package main import (
"net/http"
//"fmt"
"os"
) func proxyFunc(response http.ResponseWriter, req *http.Request) {
os.Stdout.WriteString(req.Host + "\n")
response.Write([]byte(req.Host +"\n"))
return
} func main() {
http.HandleFunc("/", proxyFunc)
http.ListenAndServe(":9111", nil)
}
编译:go build proxy.go
执行:./proxy
客户端测试:curl curl http://127.0.0.1:9111/
测试输出:127.0.0.1:9111
实验2:获取request的body数据长度
package main import (
"net/http"
"fmt"
"io/ioutil"
) func proxyFunc(response http.ResponseWriter, req *http.Request) {
body, _ := ioutil.ReadAll(req.Body)
bodyLen := len(string(body))
response.Write([]byte(fmt.Sprintf("body len: %d\n", bodyLen)))
return
} func main() {
http.HandleFunc("/", proxyFunc)
http.ListenAndServe(":9111", nil)
}
执行:go build proxy.go && ./proxy
测试:curl --data "a=a" http://127.0.0.1:9111/
测试输出:body len: 3
实验3:做个中转机,前端请求,go中转给后端的服务
proxy.go代码
package main import (
"net/http"
//"fmt"
"io/ioutil"
//"strings"
) func proxyFunc(response http.ResponseWriter, req *http.Request) {
client := &http.Client{} path := req.URL.Path
query := req.URL.RawQuery url := "http://127.0.0.1:9112"
url += path
if len(query) > {
url += "?" + query
} proxyReq, err := http.NewRequest("POST", url, req.Body) if err != nil {
response.Write([]byte("http proxy request fail\n"))
return
} proxyReq.Header.Set("Content-Type", "application/x-www-form-urlencoded")
proxyReq.Header.Set("Cookie", "name=cookie") resp, err := client.Do(proxyReq)
defer resp.Body.Close() out, _ := ioutil.ReadAll(resp.Body)
response.Write(out)
} func main() {
http.HandleFunc("/", proxyFunc)
http.ListenAndServe(":9111", nil)
}
backend.go代码
package main import (
"io/ioutil"
"net/http"
) func procFunc(response http.ResponseWriter, req *http.Request) {
postBody, _ := ioutil.ReadAll(req.Body)
response.Write([]byte("query: " + req.URL.RawQuery + "\nbody: "))
response.Write(postBody)
response.Write([]byte("\n"))
response.Write([]byte("backend port: 9112\n"))
} func main() {
http.HandleFunc("/", procFunc)
http.ListenAndServe(":9112", nil)
}
proxy负责中转客户端请求,转到backend来处理,backend根据输入,直接打印其输出 query + post body
测试:curl --data "a=a" http://127.0.0.1:9111/?b=b1111
测试输出:
query: b=b1111
body: a=a
backend port:
本篇文章测试了:go的http server,http server对应的post数据,和golang的http request能力,代码很简单
结束分隔符!
【go】http实验的更多相关文章
- [原] 利用 OVS 建立 VxLAN 虚拟网络实验
OVS 配置 VxLAN HOST A ------------------------------------------ | zh-veth0(10.1.1.1) VM A | | ---|--- ...
- Android中Activity的四大启动模式实验简述
作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activ ...
- SEED实验系列文章目录
美国雪城大学SEEDLabs实验列表 SEEDLabs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理.项目组2002年由杜文亮教授创建,目前开发了30个实验,几百所大学已采用.实验楼 ...
- 物联网实验4 alljoyn物联网实验之手机局域网控制设备
AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...
- (转)linux下和云端通讯的例程, ubuntu和openwrt实验成功(一)
一. HTTP请求的数据流总结#上传数据, yeelink的数据流如下POST /v1.0/device/4420/sensor/9089/datapoints HTTP/1.1Host: api. ...
- (原创) alljoyn物联网实验之手机局域网控制设备
AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...
- 实验:Oracle直接拷贝物理存储文件迁移
实验目的:Oracle直接拷贝物理文件迁移,生产库有类似施工需求,故在实验环境简单验证一下. 实验环境: A主机:192.168.1.200 Solaris10 + Oracle 11.2.0.1 B ...
- Oracle RAC 更换存储实验
实验环境准备: RHEL 6.5 + Oracle 11.2.0.4 RAC (2nodes) OCR和Voting Disk使用的是OCR1磁盘组,底层对应3个1G大小的共享LUN,一般冗余: DA ...
- Vertica集群扩容实验过程记录
需求: 将3个节点的Vertica集群扩容,额外增加3个节点,即扩展到6个节点的Vertica集群. 实验环境: RHEL 6.5 + Vertica 7.2.2-2 步骤: 1.三节点Vertica ...
- 数据库---实验四 oracle的安全性和完整性控制
实验内容: (一) 授权 . 以dba用户的身份登陆oracle,创建用户u1+学号后四位,u2+学号后四位. SQL> create user u1_3985 identified by &q ...
随机推荐
- sql server 语法 MSDN
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql
- 机器学习入门-文本特征-使用LDA主题模型构造标签 1.LatentDirichletAllocation(LDA用于构建主题模型) 2.LDA.components(输出各个词向量的权重值)
函数说明 1.LDA(n_topics, max_iters, random_state) 用于构建LDA主题模型,将文本分成不同的主题 参数说明:n_topics 表示分为多少个主题, max_i ...
- android的特点有哪些
android拥有完善的应用程序框架,支持4大应用组件activity,service,contentProvider,broadcast,可以在任意层次上进行复用和更换: android中java字 ...
- Redis简单生产者消费者
注意:redis客户端执行是单线程的,不能将客户端放在外面,内部执行使用多线程的方式. // 创建生产端连接 final Jedis jedisProducter = new Jedis(R_HOST ...
- Rocket MQ 问题排查命令
修改rocketmq官方代码测试: package com.alibaba.middleware.race.rocketmq; import java.util.Scanner; import com ...
- 2.ECS内 经典网络与VPC网络的区别
对应阿里云学习视频地址:https://help.aliyun.com/video_detail/67686.html?spm=5176.208355.1107604.1.10d82ca1J91Ckt ...
- Java重写equals方法(重点讲解)
为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往 ...
- 8张思维导图学习javascript
分别归类为: javascript变量 javascript运算符 javascript数组 javascript流程语句 javascript字符串函数 javascript函数基础 javascr ...
- 1.Tomcat配置.md
1.启动 解压缩安装包后,点击startup.bat,保持控制台窗口开启 浏览器中输入http://localhost:8080 后看到启动界面则表示启动成功 点击shutdown.bat则关闭Tom ...
- Oracle 查询表的字段注释
SELECT TABLE_NAME, COLUMN_NAME, COMMENTSFROM USER_COL_COMMENTSWHERE TABLE_NAME = 'TB_MENU';