net/http包

   net/httpGo语言的内置包,它可以来创建HTTP客户端与服务端。

   并且由net/http包创建的服务端性能十分高效,甚至不用nginx部署。

client端

GET请求

   以下示例将展示如何使用net/http包来发送一次GET请求。

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net/http"
  6. )
  7. func main(){
  8. resp,err := http.Get("https://www.xiami.com/")
  9. if err != nil {
  10. fmt.Println("get failed, err:",err)
  11. return
  12. }
  13. defer resp.Body.Close() // 必须关闭回复主体,内部要求,没办法
  14. body,err := ioutil.ReadAll(resp.Body) // 读取返回出的内容,返回的是byte
  15. if err != nil{
  16. fmt.Println("read from resp.Body failed, err:",err)
  17. return
  18. }
  19. fmt.Println(string(body))
  20. }

带参数的GET

   关于GET请求的参数需要使用Go语言内置的net/url这个标准库来处理。

   以下示例中由于没带请求头,故不能返回有用的信息。仅作参考。

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net/http"
  6. "net/url"
  7. )
  8. func main() {
  9. getUrl := "https://www.baidu.com/s"
  10. data := url.Values{} // 参数带在这里面
  11. fmt.Println(data)
  12. data.Set("wd", "Golang") // 总所周知,百度的wd后是关键词
  13. u, err := url.ParseRequestURI(getUrl) // 进行拼接
  14. if err != nil {
  15. fmt.Println("parse url requestUrl failed, err:", err)
  16. return
  17. }
  18. u.RawQuery = data.Encode() // 进行url编码
  19. fmt.Println(u.String())
  20. resp, err := http.Get(u.String()) // 发送请求
  21. if err != nil {
  22. fmt.Println("get failed, err:", err)
  23. return
  24. }
  25. defer resp.Body.Close() // 必须关闭回复主体,内部要求,没办法
  26. b, err := ioutil.ReadAll(resp.Body)
  27. if err != nil {
  28. fmt.Println("get resp failed, err:", err)
  29. return
  30. }
  31. fmt.Println(string(b))
  32. }

POST请求

   以下示例将演示如何提交POST请求。

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net/http"
  6. "net/url"
  7. "strings"
  8. )
  9. func main() {
  10. postUrl := "http://127.0.0.1:9000/post_method/"
  11. contentType := "application/x-www-form-urlencoded" // 设置数据格式
  12. data := url.Values{}
  13. data.Set("name", "云崖")
  14. resp, err := http.Post(postUrl, contentType, strings.NewReader(data.Encode())) // 将post请求体转换为url编码后进行发送
  15. if err != nil {
  16. fmt.Println("post failed, err:", err)
  17. return
  18. }
  19. defer resp.Body.Close() // 必须关闭回复主体,内部要求,没办法
  20. b, err := ioutil.ReadAll(resp.Body)
  21. if err != nil {
  22. fmt.Println("resp failed, err:", err)
  23. return
  24. }
  25. fmt.Println(string(b))
  26. }

   服务端采用Django,当然你也可以使用net/http来构建服务端。

  1. def responsePost(request):
  2. if request.method == "POST":
  3. print(request.POST) # <QueryDict: {'name': ['云崖']}>
  4. username = request.POST.get("name")
  5. print(username)
  6. return HttpResponse("ok!!!")

postForm

   使用postForm可模拟发送一个表单。

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net/http"
  6. "net/url"
  7. )
  8. func main() {
  9. postUrl := "http://127.0.0.1:9000/post_form/"
  10. // 构造表单数据
  11. data := url.Values{}
  12. data.Set("name", "云崖")
  13. resp, err := http.PostForm(postUrl,data)
  14. if err != nil {
  15. fmt.Println("post failed, err:", err)
  16. return
  17. }
  18. defer resp.Body.Close() // 必须关闭回复主体,内部要求,没办法
  19. b, err := ioutil.ReadAll(resp.Body)
  20. if err != nil {
  21. fmt.Println("resp failed, err:", err)
  22. return
  23. }
  24. fmt.Println(string(b))
  25. }

定制client

   要管理HTTP客户端的头域、重定向策略和其他设置,可以修改内部的client设置。

   详情可参照官方文档。

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net/http"
  6. "net/url"
  7. "strings"
  8. )
  9. var (
  10. client = http.Client{
  11. Transport:&http.Transport{
  12. DisableKeepAlives:false, // 是否禁用长链接
  13. },
  14. }
  15. )
  16. func main() {
  17. postUrl := "http://127.0.0.1:9000/post_method/"
  18. // 构造表单数据
  19. contentType := "application/x-www-form-urlencoded" // 设置数据格式
  20. data := url.Values{}
  21. data.Set("name", "云崖")
  22. resp, err := client.Post(postUrl, contentType, strings.NewReader(data.Encode())) // 使用自定制的client进行链接
  23. if err != nil {
  24. fmt.Println("post failed, err:", err)
  25. return
  26. }
  27. defer resp.Body.Close()
  28. b, err := ioutil.ReadAll(resp.Body)
  29. if err != nil {
  30. fmt.Println("resp failed, err:", err)
  31. return
  32. }
  33. fmt.Println(string(b))
  34. }

server端

构建server端

   以下示例将演示如何简单的构造出一个server端。

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net/http"
  6. )
  7. func index(response http.ResponseWriter, request *http.Request) {
  8. b, err := ioutil.ReadFile("./index.html") // 打开的就是byte类型
  9. if err != nil {
  10. errorMsg := fmt.Sprintf("err:\n %v",err)
  11. response.Write([]byte(errorMsg))
  12. }
  13. response.Write(b)
  14. }
  15. func main() {
  16. http.HandleFunc("/index/", index)
  17. http.ListenAndServe("127.0.0.1:9000", nil) // 传入nil即可,代表使用默认的处理
  18. }

解析GET

   下面是一些解析GET请求方式的操作:

  1. func test(response http.ResponseWriter, request *http.Request) {
  2. // 解析GET
  3. defer request.Body.Close() // 使用完成后需要关闭
  4. data := request.URL.Query() // 获取参数
  5. username := data.Get("name")
  6. fmt.Println(username)

解析POST

   下面是一些解析POST请求方式的操作:

  1. func test(response http.ResponseWriter, request *http.Request) {
  2. // 解析GET
  3. defer request.Body.Close() // 使用完成后需要关闭
  4. // 1. 数据格式为url编码或multipart/form-data
  5. request.ParseForm()
  6. fmt.Println(request.PostForm) // 打印form数据
  7. fmt.Println(request.PostForm.Get("username")) // 获取数据
  8. // 2.如果是json数据格式
  9. b, err := ioutil.ReadAll(request.Body)
  10. if err != nil {
  11. fmt.Println("read request.Body failed err:",err)
  12. return
  13. }
  14. fmt.Println(string(b))

定制server

   要管理服务端的行为,可以创建一个自定义的Server:

  1. s := &http.Server{
  2. Addr: ":8080",
  3. Handler: myHandler,
  4. ReadTimeout: 10 * time.Second,
  5. WriteTimeout: 10 * time.Second,
  6. MaxHeaderBytes: 1 << 20,
  7. }
  8. log.Fatal(s.ListenAndServe())

Go net/http包的更多相关文章

  1. Npm包的开发

    个人开发包的目录结构 ├── coverage //istanbul测试覆盖率生成的文件 ├── index.js //入口文件 ├── introduce.md //说明文件 ├── lib │   ...

  2. Windows server 2012 添加中文语言包(英文转为中文)(离线)

    Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...

  3. 如何在nuget上传自己的包+搭建自己公司的NuGet服务器(新方法)

    运维相关:http://www.cnblogs.com/dunitian/p/4822808.html#iis 先注册一个nuget账号https://www.nuget.org/ 下载并安装一下Nu ...

  4. android http 抓包

    有时候想开发的时候想看APP发出的http请求和响应是什么,这就需要抓包了,这可以得到一些不为人知的api,比如还可以干些“坏事”... 需要工具: Fiddler2 抓包(点击下载) Android ...

  5. 带你实现开发者头条APP(四)---首页优化(加入design包)

    title: 带你实现开发者头条APP(四)---首页优化(加入design包) tags: design,Toolbar,TabLayout,RecyclerView grammar_cjkRuby ...

  6. git克隆项目到本地&&全局安装依赖项目&&安装依赖包&&启动服务

     一.安装本地开发环境 1.安装本项目 在需要保存到本地的项目的文件夹,进入到文件夹里点击右键,bash here,出现下图: 2.安装依赖项目  3.安装依赖包(进入到命令行) # 安装依赖包 $ ...

  7. 关于Visual Studio 未能加载各种Package包的解决方案

    问题: 打开Visual Studio 的时候,总提示未能加载相应的Package包,有时候还无法打开项目,各种提示 解决方案: 进入用户目录 C:\Users\用户名\AppData\Local\M ...

  8. VS项目中使用Nuget还原包后编译生产还一直报错?

    Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...

  9. 用Java代码实现拦截区域网数据包

    起因: 吃饭的时间在想如果区域网内都是通过路由器上网,那如何实现拦截整个区域网的数据包,从而实现某种窥探欲. 思路:      正常是通过电脑网卡预先设置或分配的IP+网关对路由器进行通讯,比如访问百 ...

  10. Android studio使用gradle动态构建APP(不同的包,不同的icon、label)

    最近有个需求,需要做两个功能相似的APP,大部分代码是一样的,只是界面不一样,以前要维护两套代码,比较麻烦,最近在网上找资料,发现可以用gradle使用同一套代码构建两个APP.下面介绍使用方法: 首 ...

随机推荐

  1. TP6.0 一对一模型关联 belongsTo 相对关联(反向关联)

    1. 创建数据表 一对一反向关联使用率很高 附表关联主表称为反向关联,又称为相对关联(tp官方手册这样叫) -- 分类表 CREATE TABLE `category` ( `id` int(10) ...

  2. 转发请求RequestDispatcher()方法用于与页面的交互

    jsp1代码 <form action="HelloServlet" > 账号: <input type="text" name=" ...

  3. IT人35岁危机:到底是因为爱还是责任?

    互联网蚕食世界,未来属于IT人. 这是属于互联网的时代,每个人都是网络的弄潮儿,由于网络越来越被需要,互联网IT行业被推上了较高的位置,这也导致IT行业的就业环境火热,越来越多的人被IT行业广阔的发展 ...

  4. 【吴恩达课程使用】keras cpu版安装【接】- anaconda (python 3.7) win10安装 tensorflow 1.8 cpu版

    一.确认tensorflow的版本: 接上一条tensorflow的安装,注意版本不匹配会出现很多问题!:[吴恩达课程使用]anaconda (python 3.7) win10安装 tensorfl ...

  5. [LeetCode]21. 合并两个有序链表(递归)

    题目 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1-> ...

  6. python测试http、websocket接口

    测试环境有个项目需要每天构造数据,来尽量保证测试环境和生产环境数据量保持一致.需要生成订单后商家接单完成,以下是代码,主要是用接口完成 创建订单 # coding=utf-8 import reque ...

  7. python中的运动控制函数

    运动控制函数:控制海龟走直线&走曲线 海龟向前行进,海龟走直线,参数d表示行进距离,也可以为负数,单位是像素 根据半径r绘制extent角度的弧形 r : 默认圆心在海龟左侧r 距离的位置 e ...

  8. 栈帧的内部结构--动态链接 (Dynamic Linking)

    每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返 ...

  9. volatile关键字解释和使用

    一.java内存模型的相关概念:原子性.可见性与有序性 原子性: 原子是世界上的最小单位,具有不可分割性.比如 a=0:(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原 ...

  10. 提权 EXP

    windows: 漏洞列表 #Security Bulletin #KB #Description #Operating System CVE-2017-0213 [Windows COM Eleva ...