Go net/http 发送常见的 http 请求
使用 golang 中的 net/http 包来发送和接收 http 请求
开启 web server
先实现一个简单的 http server,用来接收请求
package main
import (
"fmt"
"io"
"io/ioutil"
"net/http"
) func IndexHandler(w http.ResponseWriter, r *http.Request){
//打印请求主机地址
fmt.Println(r.Host)
//打印请求头信息
fmt.Printf("header content:[%v]\n", r.Header) //获取 post 请求中 form 里边的数据
fmt.Printf("form content:[%s, %s]\n", r.PostFormValue("username"), r.PostFormValue("passwd")) //读取请求体信息
bodyContent, err := ioutil.ReadAll(r.Body)
if err != nil && err != io.EOF {
fmt.Printf("read body content failed, err:[%s]\n", err.Error())
return
}
fmt.Printf("body content:[%s]\n", string(bodyContent)) //返回响应内容
fmt.Fprintf(w, "hello world ~")
} func main (){
http.HandleFunc("/index", IndexHandler)
http.ListenAndServe("10.10.19.200:8000", nil)
}
发送 GET 请求
最基本的GET请求
package main
import (
"fmt"
"io/ioutil"
"net/http"
) func httpGet(url string) (err error) {
resp, err := http.Get(url)
if err != nil {
fmt.Printf("get request failed, err:[%s]", err.Error())
return
}
defer resp.Body.Close() bodyContent, err := ioutil.ReadAll(resp.Body)
fmt.Printf("resp status code:[%d]\n", resp.StatusCode)
fmt.Printf("resp body data:[%s]\n", string(bodyContent))
return
} func main() {
var url = "http://10.10.19.200:8000/index"
httpGet(url)
}
带参数的 GET 请求
1)在 url 后面携带参数
package main
import (
"fmt"
"io/ioutil"
"net/http"
) func httpGet(url string) (err error) {
resp, err := http.Get(url)
if err != nil {
fmt.Printf("get request failed, err:[%s]", err.Error())
return
}
defer resp.Body.Close() bodyContent, err := ioutil.ReadAll(resp.Body)
fmt.Printf("resp status code:[%d]\n", resp.StatusCode)
fmt.Printf("resp body data:[%s]\n", string(bodyContent))
return
} func main() {
var url = "http://10.10.19.200:8000/index?query=googlesearch"
httpGet(url)
}
2)如果想要把一些参数做成变量,然后放到 url 中,可以参考下面的方式
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
) func httpGet(requestUrl string) (err error) {
Url, err := url.Parse(requestUrl)
if err != nil {
fmt.Printf("requestUrl parse failed, err:[%s]", err.Error())
return
} params := url.Values{}
params.Set("query","googlesearch")
params.Set("content","golang")
Url.RawQuery = params.Encode() requestUrl = Url.String()
fmt.Printf("requestUrl:[%s]\n", requestUrl) resp, err := http.Get(requestUrl)
if err != nil {
fmt.Printf("get request failed, err:[%s]", err.Error())
return
}
defer resp.Body.Close() bodyContent, err := ioutil.ReadAll(resp.Body)
fmt.Printf("resp status code:[%d]\n", resp.StatusCode)
fmt.Printf("resp body data:[%s]\n", string(bodyContent))
return
} func main() {
var url = "http://10.10.19.200:8000/index"
httpGet(url)
}
运行结果:
requestUrl:[http://10.10.19.200:8000/index?content=golang&query=googlesearch]
resp status code:[200]
resp body data:[hello world ~]
GET 请求添加请求头
package main import (
"fmt"
"io/ioutil"
"net/http"
) func httpGet(requestUrl string) (err error) {
client := &http.Client{}
requestGet, _:= http.NewRequest("GET", requestUrl, nil) requestGet.Header.Add("query", "googlesearch")
requestGet.Header.Add("content", "golang") resp, err := client.Do(requestGet)
if err != nil {
fmt.Printf("get request failed, err:[%s]", err.Error())
return
}
defer resp.Body.Close() bodyContent, err := ioutil.ReadAll(resp.Body)
fmt.Printf("resp status code:[%d]\n", resp.StatusCode)
fmt.Printf("resp body data:[%s]\n", string(bodyContent))
return
} func main() {
var url = "http://10.10.19.200:8000/index"
httpGet(url)
}
从 http server 端可以看到设置的请求头数据:
type:[http.Header], header content:[map[Accept-Encoding:[gzip] Content:[golang] Query:[googlesearch] User-Agent:[Go-http-client/1.1]]]
发送 POST 请求
发送 form 表单格式的 post 请求
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
) func httpPost(requestUrl string) (err error) {
data := url.Values{}
data.Add("username", "seemmo")
data.Add("passwd", "da123qwe") resp, err := http.PostForm(requestUrl, data)
if err != nil {
fmt.Printf("get request failed, err:[%s]", err.Error())
return
}
defer resp.Body.Close() bodyContent, err := ioutil.ReadAll(resp.Body)
fmt.Printf("resp status code:[%d]\n", resp.StatusCode)
fmt.Printf("resp body data:[%s]\n", string(bodyContent))
return
} func main() {
var url = "http://10.10.19.200:8000/index"
httpPost(url)
}
发送 json 格式的 post 请求
1)使用 http.Client
下面的请求中没有携带请求头 Content-Type
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
) func httpPost(requestUrl string) (err error) {
client := &http.Client{} data := make(map[string]interface{})
data["name"] = "seemmo"
data["passwd"] = "da123qwe"
jsonData, _ := json.Marshal(data) requestPost, err := http.NewRequest("POST", requestUrl, bytes.NewReader(jsonData))
resp, err := client.Do(requestPost)
if err != nil {
fmt.Printf("get request failed, err:[%s]", err.Error())
return
}
defer resp.Body.Close() bodyContent, err := ioutil.ReadAll(resp.Body)
fmt.Printf("resp status code:[%d]\n", resp.StatusCode)
fmt.Printf("resp body data:[%s]\n", string(bodyContent))
return
} func main() {
var url = "http://10.10.19.200:8000/index"
httpPost(url)
}
2)使用 http.Post
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
) func httpPost(requestUrl string) (err error) {
data := make(map[string]interface{})
data["name"] = "seemmo"
data["passwd"] = "da123qwe"
jsonData, _ := json.Marshal(data) resp, err := http.Post(requestUrl, "application/json", bytes.NewReader(jsonData))
if err != nil {
fmt.Printf("get request failed, err:[%s]", err.Error())
return
}
defer resp.Body.Close() bodyContent, err := ioutil.ReadAll(resp.Body)
fmt.Printf("resp status code:[%d]\n", resp.StatusCode)
fmt.Printf("resp body data:[%s]\n", string(bodyContent))
return
} func main() {
var url = "http://10.10.19.200:8000/index"
httpPost(url)
}
参考链接:https://www.cnblogs.com/zhaof/p/11346412.html
ending~
Go net/http 发送常见的 http 请求的更多相关文章
- java常见的 http 请求库比较
java常见的http请求库有httpclient,RestTemplate,OKhttp,更高层次封装的 feign.retrofit 1.HttpClient HttpClient:代码复杂,还得 ...
- (七)四种常见的post请求中的参数形式
原文链接:https://blog.csdn.net/jiadajing267/article/details/87883725 1).HTTP 协议是以 ASCII 码 传输,建立在 TCP/IP ...
- [转]利用URLConnection来发送POST和GET请求
URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...
- 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求
通用辅助类 下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中发送GET/HTTP/HTTPS请求,因为有的时候需 要获取认证信息(如Cookie),所以返回的是HttpWeb ...
- (转) 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求
转自:http://blog.csdn.net/zhoufoxcn/article/details/6404236 通用辅助类 下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中 ...
- iOS开发网络篇—发送GET和POST请求(使用NSURLSession)
iOS开发网络篇—发送GET和POST请求(使用NSURLSession) 说明: 1)该文主要介绍如何使用NSURLSession来发送GET请求和POST请求 2)本文将不再讲解NSURLConn ...
- Ajax详解及其案例分析------如何获得Ajax对象,使用Ajax对象发送GET和POST请求,校验用户名,POST和GET请求时的乱码处理,实现级联的下拉列表
本节主要内容预览: 1 获得Ajax对象 2 使用Ajax对象发送GET请求 3 使用Ajax对象发送POST请求 4 使用Ajax校验用户名 5 POST请求时的乱码处理 6 GET请求时的乱码处理 ...
- php 利用socket发送GET,POST请求
作为php程序员一定会接触http协议,也只有深入了解http协议,编程水平才会更进一步.最近我一直在学习php的关于http的编程,许多东西恍然大悟,受益匪浅.希望分享给大家.本文需要有一定http ...
- 【转】在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求
http://zhoufoxcn.blog.51cto.com/792419/561934 这个需求来自于我最近练手的一个项目,在项目中我需要将一些自己发表的和收藏整理的网文集中到一个地方存放,如果全 ...
随机推荐
- tomcat的AJP(定向包协议)协议
由于tomcat的html和图片解析功能相对其他服务器如apche等较弱,所以,一般都是集成起来使用,只有jsp和servlet服务交由tomcat处理,而tomcat和其他服务器的集成,就是通过aj ...
- Flutter Offstage、Visibility隐藏/可见
Offstage是控制组件隐藏/可见的组件,如果感觉有些单调功能不全,我们可以使用Visibility,Visibility也是控制子组件隐藏/可见的组件.不同是的Visibility有隐藏状态是否留 ...
- Dart对象和类
/* 面向对象编程(OOP)的三个基本特征是:封装.继承.多态 封装:封装是对象和类概念的主要特性.封装,把客观事物封装成抽象的类,并且把自己的部分属性和方法提供给其他对象调用, 而一部分属性和方法则 ...
- matlab基本函数sort
一起来学演化计算-matlab基本函数sort 觉得有用的话,欢迎一起讨论相互学习~Follow Me sort 对数组元素排序 语法 B = sort(A) 按照大小不等于1的第一个数组维度对A的元 ...
- Swift4.0复习协议
1.协议的定义: /// 定义一个协议MyProt protocol MyProt { /// 声明了一个实例方法foo, /// 其类型为:() -> Void func foo() ...
- jenkins--master/slave模式---master是容器版---slave是非容器版
实验架构: 192.168.0.96 gitlab 192.168.0.97 jenkins.tomcat 192.168.0.98 harbor.docker集群.git.jdk.maven 1.先 ...
- Jupyter notbook 修改默认路径
打开 cmd 输入命令 jupyter notebook --generate-config 2.打开配置文件 3.修改路径 转自: https://blog.csdn.net/zw__chen ...
- C++标准模板库集合类与映射类总结
一.STL集合类 标准模板库向程序员提供了一些容器类,以便在应用程序中频繁而快速的搜索.std::set和std::multiset用于存储一组经过排序的元素,其查找元素的复杂度为对数,而unorde ...
- 最新 迅游科技java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.迅游科技等10家互联网公司的校招Offer,因为某些自身原因最终选择了迅游科技.6.7月主要是做系统复习.项目复盘.Leet ...
- 图解JavaScript闭包面试题
由于最近在学习关于闭包相关的知识,并且闭包这个知识点让我有点搞不太清楚其具体的定义,所以在网上也查阅了很多大佬的讲解和对闭包的一个定义. 最后感觉还是MDN上的说法感觉比较好理解一些,对闭包还是不太理 ...