Go语言-基本的http请求操作
Go发起GET请求
基本的GET请求
//基本的GET请求
package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
)
func main() {
    resp, err := http.Get("http://www.hao123.com")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
    fmt.Println(resp.StatusCode)
    if resp.StatusCode == 200 {
        fmt.Println("ok")
    }
}
带参数的GET请求
package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
)
func main(){
    resp, err := http.Get("http://www.baidu.com?name=Paul_Chan&age=26")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
如果我们想要把一些参数做成变量而不是直接放到url中怎么操作,代码例子如下:
package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
)
func main(){
    params := url.Values{}
    Url, err := url.Parse("http://www.baidu.com")
    if err != nil {
        return
    }
    params.Set("name","Paul_Chan")
    params.Set("age","26")
    //如果参数中有中文参数,这个方法会进行URLEncode
    Url.RawQuery = params.Encode()
    urlPath := Url.String()
    fmt.Println(urlPath) // https://www.baidu.com?age=26&name=Paul_chan
    resp,err := http.Get(urlPath)
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
解析JSON类型的返回结果
package main
import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)
type result struct {
    Args string `json:"args"`
    Headers map[string]string `json:"headers"`
    Origin string `json:"origin"`
    Url string `json:"url"`
}
func main() {
    resp, err := http.Get("http://xxx.com")
    if err != nil {
        return
    }
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
    var res result
    _ = json.Unmarshal(body,&res)
    fmt.Printf("%#v", res)
}
GET请求添加请求头
package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
)
func main() {
    client := &http.Client{}
    req,_ := http.NewRequest("GET","http://xxx.com",nil)
    req.Header.Add("name","Paul_Chan")
    req.Header.Add("age","26")
    resp,_ := client.Do(req)
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Printf(string(body))
}
从上述的结果可以看出我们设置的头是成功了:
{
  "args": {},
  "headers": {
    "Accept-Encoding": "gzip",
    "Age": "26",
    "Host": "xxx.com",
    "Name": "Paul_Chan",
    "User-Agent": "Go-http-client/1.1"
  },
  "origin": "211.138.20.170, 211.138.20.170",
  "url": "https://xxx.com"
}
golang 发起POST请求
基本的POST使用
package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
)
func main() {
    urlValues := url.Values{}
    urlValues.Add("name","Paul_Chan")
    urlValues.Add("age","26")
    resp, _ := http.PostForm("http://xxx.com/post",urlValues)
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
//结果如下:
/******************
{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "age": "26",
    "name": "Paul_Chan"
  },
  "headers": {
    "Accept-Encoding": "gzip",
    "Content-Length": "19",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "Go-http-client/1.1"
  },
  "json": null,
  "origin": "211.138.20.170, 211.138.20.170",
  "url": "https://httpbin.org/post"
}
******************/
另外一种方式
package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "strings"
)
func main() {
    urlValues := url.Values{
        "name":{"Paul_Chan"},
        "age":{"26"},
    }
    reqBody:= urlValues.Encode()
    resp, _ := http.Post("http://xxx.com/post", "text/html",strings.NewReader(reqBody))
    body,_:= ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
//结果如下:
/**************
{
  "args": {},
  "data": "age=26&name=Paul_Chan",
  "files": {},
  "form": {},
  "headers": {
    "Accept-Encoding": "gzip",
    "Content-Length": "19",
    "Content-Type": "text/html",
    "Host": "httpbin.org",
    "User-Agent": "Go-http-client/1.1"
  },
  "json": null,
  "origin": "211.138.20.170, 211.138.20.170",
  "url": "https://httpbin.org/post"
}
***************/
发送JSON数据的post请求
package main
import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)
func main() {
    client := &http.Client{}
    data := make(map[string]interface{})
    data["name"] = "zhaofan"
    data["age"] = "23"
    bytesData, _ := json.Marshal(data)
    req, _ := http.NewRequest("POST","http://httpbin.org/post",bytes.NewReader(bytesData))
    resp, _ := client.Do(req)
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
//结果如下:
/*************
{
  "args": {},
  "data": "{\"age\":\"23\",\"name\":\"zhaofan\"}",
  "files": {},
  "form": {},
  "headers": {
    "Accept-Encoding": "gzip",
    "Content-Length": "29",
    "Host": "httpbin.org",
    "User-Agent": "Go-http-client/1.1"
  },
  "json": {
    "age": "23",
    "name": "zhaofan"
  },
  "origin": "211.138.20.170, 211.138.20.170",
  "url": "https://httpbin.org/post"
}
*************/
不用client的post请求
package main
import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)
func main() {
    data := make(map[string]interface{})
    data["name"] = "zhaofan"
    data["age"] = "23"
    bytesData, _ := json.Marshal(data)
    resp, _ := http.Post("http://httpbin.org/post","application/json", bytes.NewReader(bytesData))
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
做任何事情,都要以创业的心态去干!
Go语言-基本的http请求操作的更多相关文章
- Win8开虚拟wifi ‘无法启动承载网络 组或资源的状态不是执行请求操作的正确状态“
		第一步,首先我们点开开始按钮菜单,要右键以“管理员身份”打开CMD“命令提示符”并键入或者复制(粘贴)命令:netsh wlan show drivers 查看本机无线网卡是否支持此项Wifi热点共享 ... 
- YTU 2974: C语言习题5.26--文件操作3
		2974: C语言习题5.26--文件操作3 时间限制: 1 Sec 内存限制: 128 MB 提交: 213 解决: 92 题目描述 文本文件score.dic 中存储了n名学生的信息(班级编号 ... 
- YTU 2973: C语言习题5.25--文件操作2
		2973: C语言习题5.25--文件操作2 时间限制: 1 Sec 内存限制: 128 MB 提交: 242 解决: 105 题目描述 文本文件score.dic 中存储了n名学生的信息(班级编 ... 
- YTU 2972: C语言习题5.24--文件操作1
		2972: C语言习题5.24--文件操作1 时间限制: 1 Sec 内存限制: 128 MB 提交: 248 解决: 94 题目描述 文本文件score.dic 中存储了n名学生的信息(班级编号 ... 
- C语言对mysql数据库的操作
		原文:C语言对mysql数据库的操作 这已经是一相当老的话题.不过今天我才首次使用,把今天的一些体会写下来,也许能给一些新手带来一定的帮助,更重要的是供自己今后忘记的怎么使用而进行查阅的! 我们言归正 ... 
- 使用c语言实现linux数据库的操作
		前言:上一篇讲解了linux下使用命令行操作数据库,这篇继续讲解怎么使用c语言实现linux数据库的操作. 使用c语言实现环境搭建:既然我们要使用c语言实现linux数据库操作,那么首先我们得先把数据 ... 
- 【转】python3 urllib.request 网络请求操作
		python3 urllib.request 网络请求操作 基本的网络请求示例 ''' Created on 2014年4月22日 @author: dev.keke@gmail.com ''' im ... 
- 假定某系统提供硬件的访管指令(例如形式:“svc n”),为了实现系统调用,系统设计者应做哪些工作?用户又如如何请求操作系统服务?
		工作: 1. 编写并调试好能实现各种功能的例行子程序. 2. 编写并调试好访管中断处理程序. 3. 构造例行子程序入口地址表. 在用户程序中,需要请求操作系统服务的地方安排一条系统调用.这样,当 ... 
- 在Go语言中基础的Redis操作
		在Go语言中基础的Redis操作 需要先安装redigo go get "github.com/garyburd/redigo/redis" Go语言Redis客户端的简单示例 连 ... 
随机推荐
- Latch设计模式
			import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; public class Te ... 
- 关于使用 AJax 生成Form表单,且表单提交需要验证,验证实效的解决方法
			@Ajax.ActionLink("添加", "AddUser",new AjaxOptions() {InsertionMode = InsertionMod ... 
- 渐进式web应用开发---promise式数据库(五)
			在前面的一篇文章中,我们已经实现了使用indexedDB实现ajax本地数据存储的功能,详情,请看这篇文章.现在我们需要把上面的一篇文章中的代码使用promise结构来重构下.我们为什么需要使用pro ... 
- 个人永久性免费-Excel催化剂功能第69波-打造最专业易用的商务图表库,即点即用的高级Excel图表
			Excel很大一块细分领域是图表,数据分析的末端,数据展示环节,精美恰当的图表,能够为数据分析数据结论带来画龙点睛的一笔.Excel催化剂简单内置了图表库,利用已经做好的模板式的图表示例,可快速复制使 ... 
- Spring Boot 中 Redis 的使用
			Spring Boot 对常用的数据库支持外,对 Nosql 数据库也进行了封装自动化,如Redis.MongoDB等,本文主要介绍Redis的使用. Redis 介绍 Redis 是目前业界使用最广 ... 
- markdown插入表格语法
			markdown插入表格语法 举例 如表格标题为,姓名,班级,成绩 标题内的内容为,yang,a班,100 我们要在markdow文件中插入表格 如 姓名|班级|成绩 -|-|- yang|a班|10 ... 
- [PTA] 数据结构与算法题目集 6-4 链式表的按序号查找 & 6-5 链式表操作集 & 6-6 带头结点的链式表操作集
			带不带头结点的差别就是,在插入和删除操作中,不带头结点的链表需要考虑两种情况:1.插入(删除)在头结点.2.在其他位置. 6.4 //L是给定单链表,函数FindKth要返回链式表的第K个元素.如果该 ... 
- Floyd—Warshall算法
			我们用DP来求解任意两点间的最短路问题 首先定义状态:d[k][i][k]表示使用顶点1~k,i,j的情况下,i到j的最短路径 (d[0][i][j]表示只使用i和j,因此d[0][i][j] = c ... 
- Bellman-Ford 算法
			根据之前最短路径算法里提到的,我们只要放松所有边直到其全部失效就可以得到最短路径 注意:图中不能有负圈.否则当负圈中某个点经过这个负圈的所有边的松弛操作后,这个点的的d[i]就会减小,此时会发现它可以 ... 
- php的中文字符
			在使用substr截取字符窜的时候出现乱码的问题 一直任认为字符串是2个字节,直到多次才尝试才总算知道问题所在 php的utf-8字符是每个字符3个字节 而gbk字符是每个字节2个字符 单个字母和符号 ... 
