发出GET请求
Go语言在net/http包中提供了一个快捷方法,可用于发出简单的GET请求。使用这个方法意味着不需要考虑如何配置HTTP客户端以及如何设置请求报头
在这里,我们使用上一章构建的HTTP服务器
package main
import(
"net/http"
"fmt"
"io/ioutil"
"log"
)
func main(){
//发出GET请求
response,err := http.Get("http://127.0.0.1:8000/?foo-siqu")
if err !=nil{
log.Fatal(err)
}
//在函数退出时,执行清理操作
defer response.Body.Close()
body,err := ioutil.ReadAll(response.Body)
if err != nil{
log.Fatal(err)
}
fmt.Printf("%s",body)
}
发出POST请求
package main
import(
"fmt"
"io/ioutil"
"log"
"strings"
"net/http"
)
func main(){
postData := strings.NewReader(`{"some":"json"}`)
response,err := http.Post("http://127.0.0.1:8000","application/json",postData)
if err != nil{
log.Fatal(err)
}
defer response.Body.Close()
body,err := ioutil.ReadAll(response.Body)
if err != nil{
log.Fatal(err)
}
fmt.Printf("%s",body)
}
// D:\Backup\Documents\golang>go run test_client.go
// hello
// {"some":"json"}
// POST
- 使用方法post发出POST请求,其中第一个参数是要发送到的URL,第二个为数据的内容类型,第三个为数据本身
- 声明变量postData并将一个JSON字符串赋给它。这里使用了标准库strings将其转换为io.Reader,为传输做准备
进一步控制HTTP请求
要进一步控制HTTP请求,应使用自定义的HTTP客户端
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main(){
client := &http.Client{}
request,err := http.NewRequest("GET","http://127.0.0.1:8000/?name=siqu",nil)
if err != nil {
log.Fatal(err)
}
response,err := client.Do(request)
defer response.Body.Close()
body,err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s",body)
}
// D:\Backup\Documents\golang>go run test_client.go
// hello
// name:siqu
// GET
- 不使用net/http包的快捷方法Get,而创建一个HTTP客户端
- 使用方法NewRequest向网站发出GET请求
- 使用Do发送请求并处理响应
调试HTTP请求
可以使用net/http/httputil包中的函数来进行调试,这些方法显示请求和响应的报头
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"net/http/httputil"
"os"
)
func main(){
debug := os.Getenv("DEBUG")
client := &http.Client{}
request,err := http.NewRequest("GET","http://127.0.0.1:8000/?name=siqu",nil)
if err != nil {
log.Fatal(err)
}
if debug =="1"{
debugRequest,err := httputil.DumpRequestOut(request,true)
if err !=nil {
log.Fatal(err)
}
fmt.Printf("%s",debugRequest)
}
response,err := client.Do(request)
defer response.Body.Close()
if debug =="1"{
debugResponse,err := httputil.DumpResponse(response,true)
if err != nil{
log.Fatal(err)
}
fmt.Printf("%s",debugResponse)
}
body,err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s",body)
}
// D:\Backup\Documents\golang>set DEBUG=1
// D:\Backup\Documents\golang>go run test_client.go
// GET /?name=siqu HTTP/1.1
// Host: 127.0.0.1:8000
// User-Agent: Go-http-client/1.1
// Accept-Encoding: gzip
// HTTP/1.1 200 OK
// Content-Length: 19
// Content-Type: text/plain; charset=utf-8
// Date: Fri, 29 Jan 2021 01:08:07 GMT
// hello
// name:siqu
// GEThello
// name:siqu
// GET
要想请求JSON数据,可修改客户端,设置一个请求JSON的报头
request.Header.Add("Accept","application/json")
处理超时
在有的时候,由于各种原因,我们不能让客户端一直响应下去,因此,我们需要设置一个超时时间,如果说客户端在响应的过程当中,超过这个时间,就返回一个超时信息
//在50ms内完成请求
client := &http.Client{
Timeout : 50 * time*Millisecond,
}
//在1s内完成请求
client := &http.Client{
Timeout : 1 * time * Second,
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容