zoukankan      html  css  js  c++  java
  • Go net/http包

    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:",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:", 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:", err)
    		return
    	}
    	defer resp.Body.Close() // 必须关闭回复主体,内部要求,没办法
    	b, err := ioutil.ReadAll(resp.Body)
    	if err != nil {
    		fmt.Println("get resp failed, err:", 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:", err)
    		return
    	}
    	defer resp.Body.Close() // 必须关闭回复主体,内部要求,没办法
    	b, err := ioutil.ReadAll(resp.Body)
    	if err != nil {
    		fmt.Println("resp failed, err:", 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", "云崖")
    	resp, err := http.PostForm(postUrl,data)  
    	if err != nil {
    		fmt.Println("post failed, err:", err)
    		return
    	}
    	defer resp.Body.Close() // 必须关闭回复主体,内部要求,没办法
    	b, err := ioutil.ReadAll(resp.Body)
    	if err != nil {
    		fmt.Println("resp failed, err:", 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", "云崖")
    	resp, err := client.Post(postUrl, contentType, strings.NewReader(data.Encode())) // 使用自定制的client进行链接
    	if err != nil {
    		fmt.Println("post failed, err:", err)
    		return
    	}
    	defer resp.Body.Close()
    	b, err := ioutil.ReadAll(resp.Body)
    	if err != nil {
    		fmt.Println("resp failed, err:", 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:
      %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())
    
  • 相关阅读:
    ORM的概念, ORM到底是什么
    EM算法
    贝叶斯方法的m-估计
    概率图模型之:贝叶斯网络
    决策树学习
    各种聚类算法的比较
    聚类算法:K均值
    Entity Framework + WCF 远程调用出错
    使用Entity Framework时,序列化出错
    WCF基础知识
  • 原文地址:https://www.cnblogs.com/Yunya-Cnblogs/p/13826264.html
Copyright © 2011-2022 走看看