Go net/http包
net/http包
net/http
是Go
语言的内置包,它可以来创建HTTP
客户端与服务端。
并且由net/http
包创建的服务端性能十分高效,甚至不用nginx
部署。
client端
GET请求
以下示例将展示如何使用net/http
包来发送一次GET
请求。
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main(){
resp,err := http.Get("https://www.xiami.com/")
if err != nil {
fmt.Println("get failed, err:",err)
return
}
defer resp.Body.Close() // 必须关闭回复主体,内部要求,没办法
body,err := ioutil.ReadAll(resp.Body) // 读取返回出的内容,返回的是byte
if err != nil{
fmt.Println("read from resp.Body failed, err:",err)
return
}
fmt.Println(string(body))
}
带参数的GET
关于GET
请求的参数需要使用Go
语言内置的net/url
这个标准库来处理。
以下示例中由于没带请求头,故不能返回有用的信息。仅作参考。
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
)
func main() {
getUrl := "https://www.baidu.com/s"
data := url.Values{} // 参数带在这里面
fmt.Println(data)
data.Set("wd", "Golang") // 总所周知,百度的wd后是关键词
u, err := url.ParseRequestURI(getUrl) // 进行拼接
if err != nil {
fmt.Println("parse url requestUrl failed, err:", err)
return
}
u.RawQuery = data.Encode() // 进行url编码
fmt.Println(u.String())
resp, err := http.Get(u.String()) // 发送请求
if err != nil {
fmt.Println("get failed, err:", err)
return
}
defer resp.Body.Close() // 必须关闭回复主体,内部要求,没办法
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("get resp failed, err:", err)
return
}
fmt.Println(string(b))
}
POST请求
以下示例将演示如何提交POST
请求。
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strings"
)
func main() {
postUrl := "http://127.0.0.1:9000/post_method/"
contentType := "application/x-www-form-urlencoded" // 设置数据格式
data := url.Values{}
data.Set("name", "云崖")
resp, err := http.Post(postUrl, contentType, strings.NewReader(data.Encode())) // 将post请求体转换为url编码后进行发送
if err != nil {
fmt.Println("post failed, err:", err)
return
}
defer resp.Body.Close() // 必须关闭回复主体,内部要求,没办法
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("resp failed, err:", err)
return
}
fmt.Println(string(b))
}
服务端采用Django
,当然你也可以使用net/http
来构建服务端。
def responsePost(request):
if request.method == "POST":
print(request.POST) # <QueryDict: {'name': ['云崖']}>
username = request.POST.get("name")
print(username)
return HttpResponse("ok!!!")
postForm
使用postForm
可模拟发送一个表单。
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
)
func main() {
postUrl := "http://127.0.0.1:9000/post_form/"
// 构造表单数据
data := url.Values{}
data.Set("name", "云崖")
resp, err := http.PostForm(postUrl,data)
if err != nil {
fmt.Println("post failed, err:", err)
return
}
defer resp.Body.Close() // 必须关闭回复主体,内部要求,没办法
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("resp failed, err:", err)
return
}
fmt.Println(string(b))
}
定制client
要管理HTTP
客户端的头域、重定向策略和其他设置,可以修改内部的client
设置。
详情可参照官方文档。
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strings"
)
var (
client = http.Client{
Transport:&http.Transport{
DisableKeepAlives:false, // 是否禁用长链接
},
}
)
func main() {
postUrl := "http://127.0.0.1:9000/post_method/"
// 构造表单数据
contentType := "application/x-www-form-urlencoded" // 设置数据格式
data := url.Values{}
data.Set("name", "云崖")
resp, err := client.Post(postUrl, contentType, strings.NewReader(data.Encode())) // 使用自定制的client进行链接
if err != nil {
fmt.Println("post failed, err:", err)
return
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("resp failed, err:", err)
return
}
fmt.Println(string(b))
}
server端
构建server端
以下示例将演示如何简单的构造出一个server
端。
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func index(response http.ResponseWriter, request *http.Request) {
b, err := ioutil.ReadFile("./index.html") // 打开的就是byte类型
if err != nil {
errorMsg := fmt.Sprintf("err:\n %v",err)
response.Write([]byte(errorMsg))
}
response.Write(b)
}
func main() {
http.HandleFunc("/index/", index)
http.ListenAndServe("127.0.0.1:9000", nil) // 传入nil即可,代表使用默认的处理
}
解析GET
下面是一些解析GET
请求方式的操作:
func test(response http.ResponseWriter, request *http.Request) {
// 解析GET
defer request.Body.Close() // 使用完成后需要关闭
data := request.URL.Query() // 获取参数
username := data.Get("name")
fmt.Println(username)
解析POST
下面是一些解析POST
请求方式的操作:
func test(response http.ResponseWriter, request *http.Request) {
// 解析GET
defer request.Body.Close() // 使用完成后需要关闭
// 1. 数据格式为url编码或multipart/form-data
request.ParseForm()
fmt.Println(request.PostForm) // 打印form数据
fmt.Println(request.PostForm.Get("username")) // 获取数据
// 2.如果是json数据格式
b, err := ioutil.ReadAll(request.Body)
if err != nil {
fmt.Println("read request.Body failed err:",err)
return
}
fmt.Println(string(b))
定制server
要管理服务端的行为,可以创建一个自定义的Server:
s := &http.Server{
Addr: ":8080",
Handler: myHandler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServe())
Go net/http包的更多相关文章
- Npm包的开发
个人开发包的目录结构 ├── coverage //istanbul测试覆盖率生成的文件 ├── index.js //入口文件 ├── introduce.md //说明文件 ├── lib │ ...
- Windows server 2012 添加中文语言包(英文转为中文)(离线)
Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...
- 如何在nuget上传自己的包+搭建自己公司的NuGet服务器(新方法)
运维相关:http://www.cnblogs.com/dunitian/p/4822808.html#iis 先注册一个nuget账号https://www.nuget.org/ 下载并安装一下Nu ...
- android http 抓包
有时候想开发的时候想看APP发出的http请求和响应是什么,这就需要抓包了,这可以得到一些不为人知的api,比如还可以干些“坏事”... 需要工具: Fiddler2 抓包(点击下载) Android ...
- 带你实现开发者头条APP(四)---首页优化(加入design包)
title: 带你实现开发者头条APP(四)---首页优化(加入design包) tags: design,Toolbar,TabLayout,RecyclerView grammar_cjkRuby ...
- git克隆项目到本地&&全局安装依赖项目&&安装依赖包&&启动服务
一.安装本地开发环境 1.安装本项目 在需要保存到本地的项目的文件夹,进入到文件夹里点击右键,bash here,出现下图: 2.安装依赖项目 3.安装依赖包(进入到命令行) # 安装依赖包 $ ...
- 关于Visual Studio 未能加载各种Package包的解决方案
问题: 打开Visual Studio 的时候,总提示未能加载相应的Package包,有时候还无法打开项目,各种提示 解决方案: 进入用户目录 C:\Users\用户名\AppData\Local\M ...
- VS项目中使用Nuget还原包后编译生产还一直报错?
Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...
- 用Java代码实现拦截区域网数据包
起因: 吃饭的时间在想如果区域网内都是通过路由器上网,那如何实现拦截整个区域网的数据包,从而实现某种窥探欲. 思路: 正常是通过电脑网卡预先设置或分配的IP+网关对路由器进行通讯,比如访问百 ...
- Android studio使用gradle动态构建APP(不同的包,不同的icon、label)
最近有个需求,需要做两个功能相似的APP,大部分代码是一样的,只是界面不一样,以前要维护两套代码,比较麻烦,最近在网上找资料,发现可以用gradle使用同一套代码构建两个APP.下面介绍使用方法: 首 ...
随机推荐
- idea导入spring源码
1.环境: Intellij idea 2018.2 gradle 4.10.2 spring framework:5.2.0 注意版本不符合可能会导致编译失败. 参考版本: 1.首先下载安装 Int ...
- IDEA左侧文件目录不见了,帮你找回来!
前几天不知道什么操作,把IDEA左侧项目的目录给弄没了,如下图,在百度上搜索了不少,就是没有效果,很是头疼,巧的是,今天琢磨了一下,又给弄回来了,所以在此记录一下,以后再给弄没了,就知道了,同时也算是 ...
- vue 实现原理及简单示例实现
目录 相关html代码,用于被解析绑定数据 observer代码 Dep代码 Watcher 代码 Compile 代码 vue 简要构造函数 创建vue实例 结语 主要理解.实现如下方法: Obse ...
- Hexo + Github Pages搭建个人网站主页
1.GitHub创建个人仓库 登录GitHub创建账号,同时拥有一个自己设定的用户名(username).点击New Repositories创建仓库.仓库名必须为username.github.io ...
- 关于如何设置IDEA中的servlet的模板
关于如何设置IDEA中的servlet的模板 点击左上角的File: Setting --> Editor --> File and Code Templates --> Other ...
- Traveling by Stagecoach(POJ 2686)
原题如下: Traveling by Stagecoach Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4494 Ac ...
- Robotframework自动化4-基础关键字介绍1
前言 上一节已经介绍了APP的启动,那我们就会看到我们引用了一些关键字,对于AppiumLibrary都有哪些常用的关键呢,这一节主要介绍这一部分. AppiumLibrary 常用关键字介绍 1.关 ...
- [LeetCode]26. 删除排序数组中的重复项(数组,双指针)
题目 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下 ...
- JUC使用
1.什么是JUC 源码 + 官方文档 面试高频问! java.util 工具包.包.分类 业务:普通的线程代码 Thread Runnable 没有返回值.效率相比入 Callable 相对较低! 2 ...
- 理解Java中的final关键字
final关键字的基本用法 1. 修饰类 出于安全考虑,类无法被继承 2. 修饰方法 防止继承类修改方法private方法会隐式指定为final方法: 3. 修饰变量 基本数据类型,初始化后不能再修改 ...