实验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实验的更多相关文章

  1. [原] 利用 OVS 建立 VxLAN 虚拟网络实验

    OVS 配置 VxLAN HOST A ------------------------------------------ | zh-veth0(10.1.1.1) VM A | | ---|--- ...

  2. Android中Activity的四大启动模式实验简述

    作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activ ...

  3. SEED实验系列文章目录

    美国雪城大学SEEDLabs实验列表 SEEDLabs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理.项目组2002年由杜文亮教授创建,目前开发了30个实验,几百所大学已采用.实验楼 ...

  4. 物联网实验4 alljoyn物联网实验之手机局域网控制设备

    AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...

  5. (转)linux下和云端通讯的例程, ubuntu和openwrt实验成功(一)

    一.  HTTP请求的数据流总结#上传数据, yeelink的数据流如下POST /v1.0/device/4420/sensor/9089/datapoints HTTP/1.1Host: api. ...

  6. (原创) alljoyn物联网实验之手机局域网控制设备

    AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...

  7. 实验:Oracle直接拷贝物理存储文件迁移

    实验目的:Oracle直接拷贝物理文件迁移,生产库有类似施工需求,故在实验环境简单验证一下. 实验环境: A主机:192.168.1.200 Solaris10 + Oracle 11.2.0.1 B ...

  8. Oracle RAC 更换存储实验

    实验环境准备: RHEL 6.5 + Oracle 11.2.0.4 RAC (2nodes) OCR和Voting Disk使用的是OCR1磁盘组,底层对应3个1G大小的共享LUN,一般冗余: DA ...

  9. Vertica集群扩容实验过程记录

    需求: 将3个节点的Vertica集群扩容,额外增加3个节点,即扩展到6个节点的Vertica集群. 实验环境: RHEL 6.5 + Vertica 7.2.2-2 步骤: 1.三节点Vertica ...

  10. 数据库---实验四 oracle的安全性和完整性控制

    实验内容: (一) 授权 . 以dba用户的身份登陆oracle,创建用户u1+学号后四位,u2+学号后四位. SQL> create user u1_3985 identified by &q ...

随机推荐

  1. 机器学习入门-数值特征-对数据进行log变化

    对于一些标签和特征来说,分布不一定符合正态分布,而在实际的运算过程中则需要数据能够符合正态分布 因此我们需要对特征进行log变化,使得数据在一定程度上可以符合正态分布 进行log变化,就是对数据使用n ...

  2. Django--views(视图层)

    路径匹配后-----传给视图函数 一.视图函数 视图层,熟练掌握两个对象即可:请求对象(request)和响应对象(HttpResponse) 一个视图函数,简称视图,是一个简单的Python 函数, ...

  3. python反汇编函数字节码

    使用dis模块 >>> def test(): ... print(1) ... a = 1 ... print(a) ... >>> from dis impor ...

  4. leetcode AC1 感受

    在网上第一个AC还是蛮高兴的,之前试了不少练习编程的方法,感觉不怎么适合自己,在OJ上做题的确是一个能够锻炼的方法. 之前一直研究学习的方法,往简单的说是认知.练习,往复杂的说是,保持足够input, ...

  5. Android中查看SQLite中字段数据的两种方式

    方式一:ADB Pull 通过adb pull导出*.db文件到PC的文件夹中,通过可视化工具 SQLiteExpertPers 进行查看.编辑: adb pull /data/data/com.jo ...

  6. 更新package.json中的dependencies依赖到最新版本 -

    我们从别人那里下载一个项目 ,通过package.json里面的依赖 npm  install 来安装所需要的各个包 但是 有可能项目很老,我们一个个更新又很麻烦所以 https://blog.csd ...

  7. VC++ 自定义控件的建立及使用方法

    一.VC++定义自定义控件与delphi,VB有些差异. delphi,vb在 file-new-other中建立.vc++在工具栏中就有自定义控件,但必须加入控件类型. 许多书籍都在类向导中建立.我 ...

  8. jquery滚动条平滑滑动

    采用锚点进行页面中的跳转的确很方便,但是要想增加网页的效果,可以使用jquery中的animate,实现滚动的一个动作,慢慢的滚动到你想跳转到的位置,从而看起来会非常高大上. 滚动到顶部:   $(' ...

  9. java 素数(按要求输出)

    package number; import java.util.Scanner; public class Prime { public static void main(String[] args ...

  10. Sequence 加速

    翻译说明: 原标题: Kotlin : Slow List and Lazy Sequence 原文地址: https://medium.com/@elye.project/kotlin-slow-l ...