net/http包
net/http 是Go 语言的内置包,它可以来创建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())
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|