1. go web编程入门

记录个web编程例子方便以后使用。

主要有:

  • chan的使用(带缓存,不带缓存)
  • client发起get/post请求
  • server解析get/post请求参数
  • http.HandleFunc 根据请求uri设置对应处理func

2. server.go, 参数解析返回

  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "net/http"
  6. "os"
  7. "os/signal"
  8. "strings"
  9. )
  10. func getHandler(w http.ResponseWriter, req *http.Request) {
  11. vars := req.URL.Query() //解析参数
  12. for _, v := range vars { //遍历每个参数
  13. res := fmt.Sprintf("%v", v)
  14. io.WriteString(w, "par val:"+res+"\n")
  15. }
  16. }
  17. func postHandler(w http.ResponseWriter, r *http.Request) {
  18. r.ParseForm() //解析参数,默认是不会解析的
  19. fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
  20. fmt.Println("path", r.URL.Path)
  21. fmt.Println(r.Form["url_long"])
  22. for k, v := range r.Form {
  23. fmt.Println("key:", k)
  24. fmt.Println("val:", strings.Join(v, ""))
  25. }
  26. fmt.Fprintf(w, "postHandler") //这个写入到w的是输出到客户端的
  27. }
  28. func main() {
  29. //channel 用于优雅退出
  30. c := make(chan os.Signal)
  31. signal.Notify(c, os.Interrupt, os.Kill)
  32. //定义2个处理函数
  33. http.HandleFunc("/get", getHandler)
  34. http.HandleFunc("/test", postHandler)
  35. //服务启动
  36. http.ListenAndServe(":12365", nil)
  37. //阻塞等待信号
  38. s := <-c
  39. fmt.Println("退出信号", s)
  40. }

3. client.go, 发起http get/post请求

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net/http"
  6. "net/url"
  7. )
  8. func exec_http_get(res chan string) {
  9. resp, err := http.Get("http://127.0.0.1:12365/get?url_long=long&id=12")
  10. if err != nil {
  11. //err
  12. }
  13. defer resp.Body.Close()
  14. body, err := ioutil.ReadAll(resp.Body)
  15. if err != nil {
  16. //err
  17. }
  18. res <- string(body)
  19. }
  20. func exec_http_post(res chan string) {
  21. resp, err := http.PostForm("http://127.0.0.1:12365/test",
  22. url.Values{"key": {"Value"}, "id": {"123"}})
  23. if err != nil {
  24. //request err
  25. }
  26. defer resp.Body.Close()
  27. body, err := ioutil.ReadAll(resp.Body)
  28. if err != nil {
  29. // handle error
  30. }
  31. res <- string(body)
  32. }
  33. func main() {
  34. c := make(chan string, 2)
  35. //发送get/post请求
  36. go exec_http_get(c)
  37. go exec_http_post(c)
  38. //查看结果
  39. for i := 0; i < 2; i=i+1{
  40. res := <-c
  41. fmt.Printf("结果: %v\n", res)
  42. }
  43. }

4. 参考

Go web编程实例的更多相关文章

  1. c#摄像头编程实例 (转)

    c#摄像头编程实例 摄像头编程 安装摄像头后,一般可以找到一个avicap32.dll文件 这是一个关于设想头的类 using  system;using  System.Runtime.Intero ...

  2. JAX-RS 2.0 REST客户端编程实例

    JAX-RS 2.0 REST客户端编程实例 2014/01/28 | 分类: 基础技术, 教程 | 0 条评论 | 标签: JAX-RS, RESTFUL 分享到:3 本文由 ImportNew - ...

  3. 请求转发:MVC设计模式、细节、请求域属性的编程实例、请求重定向和请求转发的区别

      请求转发:MVC设计模式.细节.请求域属性的编程实例.请求重定向和请求转发的区别 MVC设计模式将一次请求的响应过程分成三个功能模块(一般称之为层)来协同完成,这三个模块分别是Model(模型层) ...

  4. shell及编程实例

    1.shell简介 1) 概念--命令解释器 2) 常见shell bash linux标准shell sh 早期shell,较简单 csh ksh tcsh unix  shell vi  /etc ...

  5. C++ Web 编程

    C++ Web 编程 什么是 CGI? 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的. CGI 规范目前是由 NCSA 维护的,NCSA 定义 CG ...

  6. devOps开发(Web API 实例)dotnet core 和 Azure PaaS服务

    使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例) 作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何 ...

  7. C++ Web 编程(菜鸟教程)

    C++ Web 编程(菜鸟教程) C++ Web 编程 什么是 CGI? 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的. CGI 规范目前是由 NC ...

  8. PHP求职宝典系列——PHP Web 编程篇

    PHP Web 编程篇 form表单 1.简述 POST 和 GET 传输的最大容量分别是多少? GET 方法提交的表单数据被附加到 URL 上,并作为URL 的一部分发送到服务器端. URL 的长度 ...

  9. Web编程基础--HTML、CSS、JavaScript 学习之课程作业“仿360极速浏览器新标签页”

    Web编程基础--HTML.CSS.JavaScript 学习之课程作业"仿360极速浏览器新标签页" 背景: 作为一个中专网站建设出身,之前总是做静态的HTML+CSS+DIV没 ...

随机推荐

  1. appium---第四个脚本,进入app,有权限弹窗的方法

    1.以淘宝为例:进入首页,会弹出好几个权限弹窗 无法使用id定位 用xpath定位

  2. 扩展中国剩余定理 (exCRT) 的证明与练习

    原文链接https://www.cnblogs.com/zhouzhendong/p/exCRT.html 扩展中国剩余定理 (exCRT) 的证明与练习 问题模型 给定同余方程组 $$\begin{ ...

  3. docker删除名字为none的imgae

    docker rmi $(docker images -f "dangling=true" -q)

  4. P1080 国王游戏 贪心 高精度

    题目描述 恰逢 HH国国庆,国王邀请nn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 nn 位大臣排成一排,国王站在队伍的 ...

  5. quratz启动流程

    SchedulerFactory在创建quartzScheduler的过程中,将会读取配置参数,初始化各个组件. 1.启动流程图 2.ThreadPool 一般是使用SimpleThreadPool, ...

  6. quratz数据存储

    Quartz 中的 trigger 和 job 需要存储下来才能被使用. 1.两种存储方式 RAMJobStore, JobStoreSupport, 其中 RAMJobStore 是将 trigge ...

  7. 《Thinking In Java》阅读笔记

    <Thinking In Java>阅读笔记 前四章:对象导论. 一切都是对象. 操作符. 控制执行流程 public在一个文件中只能有一个,可以是一个类class或者一个接口interf ...

  8. GUI:GUI的方式创建/训练/仿真/预测神经网络—Jason niu

    (1)导入数据:点击最左底部Import 按钮 (2)创建模型network_Jason_niu:点击底部的New按钮 (3)设置参数并训练:点击底部的Open按钮 (4)仿真预测: 大功告成!

  9. POJ 3090 Visible Lattice Points 【欧拉函数】

    <题目链接> 题目大意: 给出范围为(0, 0)到(n, n)的整点,你站在(0,0)处,问能够看见几个点. 解题分析:很明显,因为 N (1 ≤ N ≤ 1000) ,所以无论 N 为多 ...

  10. HDU 3308 LCIS (经典区间合并)【线段树】

    <题目链接> 题目大意: 给你一段序列,对其进行两种操作,一是修改某个序号的点的值:二是查询某个区间的LCIS(最长上升子序列). 解题分析: 线段树区间合并的典型例题,用求某个区间的LC ...