http客户端

import “net/http”
http包提供了HTTP客户端和服务端的实现。

Get、Head、Post和PostForm函数发出HTTP/ HTTPS请求。

package main
import ("fmt""io/ioutil""net/http"
)func main() {response, err := http.Get("http://www.baidu.com")if err != nil {// handle error}//程序在使用完回复后必须关闭回复的主体。defer response.Body.Close()body, _ := ioutil.ReadAll(response.Body)fmt.Println(string(body))
}
package mainimport ("fmt""io/ioutil""net/http""bytes"
)func main() {body := "{\"action\":20}"res, err := http.Post("http://xxx.com", "application/json;charset=utf-8", bytes.NewBuffer([]byte(body)))if err != nil {fmt.Println("Fatal error ", err.Error())}defer res.Body.Close()content, err := ioutil.ReadAll(res.Body)if err != nil {fmt.Println("Fatal error ", err.Error())}fmt.Println(string(content))
}

还可以使用:
http.Client和http.NewRequest来模拟请求

package main
import ("fmt""io/ioutil""net/http""net/url""strings"
)func main() {v := url.Values{}v.Set("username", "xxxx")v.Set("password", "xxxx")//利用指定的method,url以及可选的body返回一个新的请求.如果body参数实现了io.Closer接口,Request返回值的Body 字段会被设置为body,并会被Client类型的Do、Post和PostFOrm方法以及Transport.RoundTrip方法关闭。body := ioutil.NopCloser(strings.NewReader(v.Encode())) //把form数据编下码client := &http.Client{}//客户端,被Get,Head以及Post使用reqest, err := http.NewRequest("POST", "http://xxx.com/logindo", body)if err != nil {fmt.Println("Fatal error ", err.Error())}//给一个key设定为响应的value.reqest.Header.Set("Content-Type", "application/x-www-form-urlencoded;param=value") //必须设定该参数,POST参数才能正常提交resp, err := client.Do(reqest)//发送请求defer resp.Body.Close()//一定要关闭resp.Bodycontent, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println("Fatal error ", err.Error())}fmt.Println(string(content))
}

如何创建web服务端?

package mainimport ("net/http"
)func SayHello(w http.ResponseWriter, req *http.Request) {w.Write([]byte("Hello"))
}func main() {http.HandleFunc("/hello", SayHello)http.ListenAndServe(":8001", nil)}

首先调用Http.HandleFunc
按顺序做了几件事:

  • 调用了DefaultServerMux的HandleFunc
  • 调用了DefaultServerMux的Handle
  • 往DefaultServeMux的map[string]muxEntry中增加对应的handler和路由规则

其次调用http.ListenAndServe(“:8001”, nil)
按顺序做了几件事情:

  • 实例化Server
  • 调用Server的ListenAndServe()
  • 调用net.Listen(“tcp”, addr)监听端口
  • 启动一个for循环,在循环体中Accept请求
  • 对每个请求实例化一个Conn,并且开启一个goroutine为这个请求进行服务go c.serve()
  • 读取每个请求的内容w, err := c.readRequest()
  • 判断header是否为空,如果没有设置handler(这个例子就没有设置handler),handler就设置为DefaultServeMux
  • 调用handler的ServeHttp
  • 在这个例子中,下面就进入到DefaultServerMux.ServeHttp
  • 根据request选择handler,并且进入到这个handler的ServeHTTP
   mux.handler(r).ServeHTTP(w, r)
  • 选择handler:
A 判断是否有路由能满足这个request(循环遍历ServerMux的muxEntry)B 如果有路由满足,调用这个路由handler的ServeHttpC 如果没有路由满足,调用NotFoundHandler的ServeHttp

go net/http包相关推荐

  1. Linux常用命令全集

    Table Of Contents 1. Linux常用命令全集.CHM 9 1.1 备份压缩 9 1.1.1 ar 9 1.1.2 bunzip2 11 1.1.3 bzip2 12 1.1.4 b ...

  2. IDEA设置单个文件、单个包、单个项目的编码格式

    IDEA设置单个文件.单个包.单个项目的编码格式 File-> Settings-> File Enclodings 选择编码格式,确定即可. 注意:此处的编码格式设定以后,该包已经存在的 ...

  3. JPA不同包下同类名查询出错

    不同包下同类名查询出错 异常现象:使用JPA进行查询时,JPA的实体类映射到了另外一个包下的同名类,由于两个同名类中字段名和字段数不相同,所以会出现种种查询错误. 原因及对策:这里应该是jpa实体类默 ...

  4. 手动将web项目的class文件打成jar包,手动打jar包,java -cvf,IDE打包底层指令

    手动将web项目的class文件打成jar包. 我们的项目在使用IDE进行编译后,在项目的target目录下将会生成class文件.我们可以将class文件打成jar包. 使用的到命令为: 在targ ...

  5. 将jar包部署在docker上,将jar包打成镜像,使用docker部署jar包

    假设你已经准备好以下东西,即可进行服务部署 一台安装好docker的linux服务器(安装docker见安装docker) 准备好的jar包 接下来开始吧! 将jar包上传至服务器(建好文件夹存放以方 ...

  6. jar包升级部署到服务器详细流程,将服务部署在linux中

    假设你已经准备好以下东西,即可进行服务部署 一台服务器(云服务器或虚拟机皆可) 已安装好的jdk 1.8 + 的环境(可自行百度) 打好的jar包(maven打jar包) 1. 在服务器中新建好你的项 ...

  7. jar包部署shell脚本编写,在服务器上部署jar包,在Linux服务器上部署服务,设置编码格式,设置内存管理

    准备步骤: 1.安装java环境,知道java安装目录 2.将jar包拖放或发送至服务器中(目录自定义) 一.编写shell脚本,将以下代码放在shell脚本中,将shell脚本放在jar包同级目录下 ...

  8. 手动将jar包导入pom依赖,让jar包适配本地maven项目

    前言: Oracle对maven很久没有更新依赖,虽然19年更新了一版,但pom引入一直有错误. 我用的是oralce 12的依赖,虽然有jar包,但是依赖和pom没有适配,项目打包的时候还要去中央仓 ...

  9. 将Eclipse中Web项目打成war包

    将Eclipse中Web项目打成war包 请按如下操作即可:

  10. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

最新文章

  1. VBS 自动打开软件
  2. IOS-C语言第1天
  3. 向上造型和向下造型_盆景造型大全——造型教程
  4. python控制autocad_利用python控制Autocad:pyautocad方式
  5. Gridview行随鼠标变色
  6. 8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系
  7. AI算法连载04:数学基础之蒙特卡洛方法与MCMC采样
  8. 数据分析中的可视化-常见图形
  9. matlab字符串转换
  10. Android Spinner填充数据后设置默认值的问题
  11. java工程师面试几百问_不是吧?面试被问了几百遍的JVM,你还搞不清楚?
  12. t检验及python代码实现
  13. IT界5大女神程序员,我觉得最后那位很有内涵
  14. 巴菲特致股东的一封信:1990年
  15. PhotoShop基础入门
  16. 花旗杯决赛第二 + 最佳移动应用
  17. 微信支付以及接入SDK支付
  18. 华硕主板power supply surges detected during the previons power on 问题解决
  19. python全栈工程师 pdf_python全栈工程师项目开发实例实战入门教程百度云
  20. 2021 typescript史上最强学习入门文章(4w字)

热门文章

  1. Spring-读取properties文件
  2. python中参数的顺序和sys.argv顺序要一样么_Python中 sys.argv[]的用法简明解释
  3. python socketserver模块详解_Python: SocketServer模块
  4. vscode open with live server_vscode容器开发填坑记录remote-container
  5. VS2019中,一个解决方案拥有多个项目,如何快速选择启动项目
  6. Direct2D处理几何图形之间的碰撞检测(下)
  7. LucasExlucas
  8. Java web servers 间是如何实现 session 同步的
  9. ArrayQueue详解(待解决)
  10. 浅谈Hybrid技术的设计与实现第二弹