go net/http包的基本使用
2021/12/26 23:12:29
本文主要是介绍go net/http包的基本使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、首先实现一个简单的http server,用来接收请求(文件名:LocalServer.go)
package main import ( "encoding/json" "fmt" "io" "io/ioutil" "net/http" ) // 处理POST请求 func dealPostRequestHandler(w http.ResponseWriter, r *http.Request) { // 请求的主机 fmt.Println(r.Host) // 请求头信息 //fmt.Println("header content info : ", r.Header) // 请求体数据 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)) //返回响应内容 json.NewEncoder(w).Encode(string(bodyContent)) } // 处理GET请求 func dealGetRequestHandler(w http.ResponseWriter, r *http.Request) { // 请求的主机 fmt.Println(r.Host) // 获取请求的参数 query := r.URL.Query() jsonStr, err := json.Marshal(query) if err != nil { return } fmt.Println("get request param: " + string(jsonStr) + "\n") // 解析请求参数 name, ok := query["name"] if !ok || len(name[0]) < 1 { return } fmt.Println("get param-name: " + name[0]) json.NewEncoder(w).Encode(name[0]) } func main() { http.HandleFunc("/req/post", dealPostRequestHandler) http.HandleFunc("/req/get", dealGetRequestHandler) http.ListenAndServe(":8005", nil) }
该server监听8005端口,实现了处理POST和GET请求的handler。
2、创建测试net/http的文件(文件名:TestNetHttp.go), 代码如下:
package main import ( "bytes" "encoding/json" "fmt" "io/ioutil" "net/http" "net/url" ) // 使用http.Post , 参数格式:json func httpPost(requestUrl string, params map[string]string) (err error) { jsonData, _ := json.Marshal(params) resp, err := http.Post(requestUrl, "application/x-www-form-urlencoded", bytes.NewReader(jsonData)) if err != nil { fmt.Println("send post 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 } // 使用http.Client , 参数格式:json func httpClient(requestUrl string, params map[string]string) (err error) { client := http.Client{} jsonData, _ := json.Marshal(params) requestPost, err := http.NewRequest("POST", requestUrl, bytes.NewReader(jsonData)) resp, err := client.Do(requestPost) if err != nil { fmt.Printf("send post 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 } // 发送 form 表单格式的post请求 func httpPostForm(requestUrl string) (err error) { data := url.Values{} data.Add("name", "admin") data.Add("passwd", "123456") resp, err := http.PostForm(requestUrl, data) if err != nil { fmt.Println("send post 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 } // 发送基本的GET请求 func httpGet(url string) (err error) { resp, err := http.Get(url) if err != nil { fmt.Printf("send 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 } // 发送GET请求, 把参数做成变量放到url中。 func httpGetOne(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() { // mock post请求 //post_request_url := "http://localhost:8005/req/post" // 发送json格式的post请求 //params := map[string]string{"name":"admin","passwd":"123456"} //httpPost(post_request_url, params) //httpClient(post_request_url, params) // 发送form格式的post请求 //httpPostForm(post_request_url) // mock get请求 //httpGet("http://localhost:8005/req/get?name=admin") httpGetOne("http://localhost:8005/req/get") }
该文件包含了3个POST请求方法(其中2个发送json格式的数据,1个发送form格式的数据),分别使用了http.POST 、 http.Client 、http.PostForm 。 2个GET请求的方法。
测试方法:
1、运行LocalServer.go
2、运行TestNetHttp.go,分别发送POST和GET请求
示例:发送httPost请求,http server的控制台打印结果:
localhost:8005 body content:[{"name":"admin","passwd":"123456"}]
发送http请求的测试端打印结果:
resp status code:[200] resp body data:["{\"name\":\"admin\",\"passwd\":\"123456\"}" ]
参考:
https://www.cnblogs.com/kaichenkai/p/11365020.html
https://cloud.tencent.com/developer/section/1143633
这篇关于go net/http包的基本使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15SendGrid 的 Go 客户端库怎么实现同时向多个邮箱发送邮件?-icode9专业技术文章分享
- 2024-11-15SendGrid 的 Go 客户端库怎么设置header 和 标签tag 呢?-icode9专业技术文章分享
- 2024-11-12Cargo deny安装指路
- 2024-11-02MongoDB项目实战:从入门到初级应用
- 2024-11-01随时随地一键转录,Google Cloud 新模型 Chirp 2 让语音识别更上一层楼
- 2024-10-25Google Cloud动手实验详解:如何在Cloud Run上开发无服务器应用
- 2024-10-24AI ?先驱齐聚 BAAI 2024,发布大规模语言、多模态、具身、生物计算以及 FlagOpen 2.0 等 AI 模型创新成果。
- 2024-10-20goland工具下,如修改一个项目的标准库SDK的版本-icode9专业技术文章分享
- 2024-10-17Go学习:初学者的简单教程
- 2024-10-17Go学习:新手入门完全指南