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())
    
  • 相关阅读:
    PAT 1088. Rational Arithmetic
    PAT 1087. All Roads Lead to Rome
    PAT 1086. Tree Traversals Again
    PAT 1085. Perfect Sequence
    PAT 1084. Broken Keyboard
    PAT 1083. List Grades
    PAT 1082. Read Number in Chinese
    求最大公因数
    [转载]Latex文件转成pdf后的字体嵌入问题的解决
    [转载]Matlab有用的小工具小技巧
  • 原文地址:https://www.cnblogs.com/Yunya-Cnblogs/p/13826264.html
Copyright © 2011-2022 走看看