使用 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 请求的更多相关文章

  1. java常见的 http 请求库比较

    java常见的http请求库有httpclient,RestTemplate,OKhttp,更高层次封装的 feign.retrofit 1.HttpClient HttpClient:代码复杂,还得 ...

  2. (七)四种常见的post请求中的参数形式

    原文链接:https://blog.csdn.net/jiadajing267/article/details/87883725 1).HTTP 协议是以 ASCII 码 传输,建立在 TCP/IP ...

  3. [转]利用URLConnection来发送POST和GET请求

    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...

  4. 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求

    通用辅助类  下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中发送GET/HTTP/HTTPS请求,因为有的时候需 要获取认证信息(如Cookie),所以返回的是HttpWeb ...

  5. (转) 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求

    转自:http://blog.csdn.net/zhoufoxcn/article/details/6404236 通用辅助类 下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中 ...

  6. iOS开发网络篇—发送GET和POST请求(使用NSURLSession)

    iOS开发网络篇—发送GET和POST请求(使用NSURLSession) 说明: 1)该文主要介绍如何使用NSURLSession来发送GET请求和POST请求 2)本文将不再讲解NSURLConn ...

  7. Ajax详解及其案例分析------如何获得Ajax对象,使用Ajax对象发送GET和POST请求,校验用户名,POST和GET请求时的乱码处理,实现级联的下拉列表

    本节主要内容预览: 1 获得Ajax对象 2 使用Ajax对象发送GET请求 3 使用Ajax对象发送POST请求 4 使用Ajax校验用户名 5 POST请求时的乱码处理 6 GET请求时的乱码处理 ...

  8. php 利用socket发送GET,POST请求

    作为php程序员一定会接触http协议,也只有深入了解http协议,编程水平才会更进一步.最近我一直在学习php的关于http的编程,许多东西恍然大悟,受益匪浅.希望分享给大家.本文需要有一定http ...

  9. 【转】在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求

    http://zhoufoxcn.blog.51cto.com/792419/561934 这个需求来自于我最近练手的一个项目,在项目中我需要将一些自己发表的和收藏整理的网文集中到一个地方存放,如果全 ...

随机推荐

  1. Windows下压缩包安装Mysql

    1. 下载mysql压缩包 2. 解压到指定目录,例如D:\Program Files\mysql-5.7.25-winx64 3. 在目录下创建配置文件my.ini [mysqld] port = ...

  2. nginx高级玩法之根据来源ip分流

    author :headsen chen date :   2019-08-15  16:37:05 notice :个人原创 需求:根据不同的请求的来源ip实现分流到不同的后端上去 方法一:1,在s ...

  3. [转][osg]探究osg中的程序设计模式【目录】

    作者:3wwang 原文接连:http://www.3wwang.cn/html/article_104.html 前序 探究osg中的程序设计模式---开篇 探究osg中的程序设计模式---创造性模 ...

  4. Spring5源码分析之AnnotationConfigApplicationContext

    前言: 主要了解的内容有如下几点: @Qualifier与@Primary注解的使用 Spring中ApplicationContext的作用 BeanFactory与ApplicationConte ...

  5. Qt编写自定义控件60-声音波形图

    一.前言 这个控件源自于一个音乐播放器,在写该音乐播放器的时候,需要将音频的数据转换成对应的频谱显示,采用的fmod第三方库来处理(fmod声音系统是为游戏开发者准备的革命性音频引擎,非常强大和牛逼) ...

  6. RabbitMQ 入门教程(PHP版) 第六部分:远程调用(RPC)

    在云计算环境中,很多时候需要用它其他机器的计算资源,把一部分计算任务分配到其他节点来完成.RabbitMQ 如何使用 RPC 呢?下面将会通过其它节点完成斐波纳契示例. 流程图  当客户端启动时,它 ...

  7. 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法 (转)

    本文转自:http://blog.csdn.net/limlimlim/article/details/8647038 [导读]ServiceDescriptionImporter是创建Web Ser ...

  8. Python - Django - 母版和继承

    可以把多个页面相同的部分提取出来,放在一个母板里,这些页面只需要继承这个母板就好了 通常会在母板中定义页面专用的 CSS 块和 JS 块,方便子页面替换 定义块: {% block 名字 %} {% ...

  9. webStorm 如何修改angular中html的字体颜色

     请问一下:在html中怎么修改这个的颜色呢? (这个是ng中html的语法主要双括号里面的紫色太暗了,有时候都看不清是什么东东了)   修改方案:(说明:第三步需要把最后的选择框去掉,默认是选中的, ...

  10. 05点睛Spring MVC 4.1-服务器端推送

    转发:https://www.iteye.com/blog/wiselyman-2214626 5.1 服务器端推送 SSE(server send event)是一种服务器端向浏览器推送消息的技术, ...