加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Go net/http包

发布时间:2020-12-16 09:20:08 所属栏目:大数据 来源:网络整理
导读:net/http包 net/http 是 Go 语言的内置包,它可以来创建 HTTP 客户端与服务端。 并且由 net/http 包创建的服务端性能十分高效,甚至不用 nginx 部署。 client端 GET请求 以下示例将展示如何使用 net/http 包来发送一次 GET 请求。 package mainimport ("fmt"

net/http包

   net/httpGo语言的内置包,它可以来创建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)
		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)
		return
	}
	u.RawQuery = data.Encode() // 进行url编码
	fmt.Println(u.String())
	resp,err := http.Get(u.String()) // 发送请求
	if err != nil {
		fmt.Println("get failed,err)
		return
	}
	defer resp.Body.Close() // 必须关闭回复主体,内部要求,没办法
	b,err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("get resp failed,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 := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("resp failed,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",err := http.PostForm(postUrl,data)  
	if err != nil {
		fmt.Println("post failed,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",err := client.Post(postUrl,strings.NewReader(data.Encode())) // 使用自定制的client进行链接
	if err != nil {
		fmt.Println("post failed,err)
		return
	}
	defer resp.Body.Close()
	b,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())

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读