使用 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. layui 鼠标悬停单元格显示全部

    {field : 'subjectId',title : '主题id',align: 'center',edit : 'text',templet:'<div><span title ...

  2. Leetcode: Stream of Characters

    Implement the StreamChecker class as follows: StreamChecker(words): Constructor, init the data struc ...

  3. ROS tf基础使用知识

    博客参考:https://www.ncnynl.com/archives/201702/1306.html ROS与C++入门教程-tf-坐标变换 说明: 介绍在c++实现TF的坐标变换 概念: Co ...

  4. 004-行为型-03-观察者模式(Observer)

    一.概述 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象. 定义了对象之间的一对多依赖,让多个观察者对象同时监听某一 ...

  5. linux非root用户安装rabbitmq

    因为rabbitmq是用erlang语言写的,所以装rabbitmq前第一步得先装erlang. 我们到erlang官网https://www.erlang.org/downloads下载安装包,最新 ...

  6. Spring cloud微服务安全实战-3-14章节小结

    认证:一个httpBasic 一个是用户名密码的认证 授权:数据库内判断的r就是读 w就是写 ,ACL 获取用户信息的这段逻辑,实际上着也是安全机制的一种.防止越权,当前只能看到自己的信息. Spri ...

  7. VS编译出错不自动运行上次的程序

  8. python 调用java脚本的加密(没试过,先记录在此)

    http://lemfix.com/topics/344 前言 自动化测试应用越来越多了,尤其是接口自动化测试. 在接口测试数据传递方面,很多公司都会选择对请求数据进行加密处理. 而目前为主,大部分公 ...

  9. Linux系统调优——系统整体运行状态排查(七)

    (1).vmstat vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的整体状态值,包括服务器的CPU使用率,MEM内存使用,VMSwap虚拟内存交换情况,IO读写 ...

  10. jQuery根据style筛选元素

    <div style="display:block;"> <input/> </div> <div style="display ...