12、net/http包

本文详细介绍了Go语言中的HTTP操作,包括GET和POST请求的实现,如使用`http.Get`和`http.PostForm`,以及如何处理JSON数据。此外,还展示了如何自定义请求使用`http.Client`,并提供了搭建HTTP服务器的示例,演示了如何响应客户端请求并返回HTML内容。
摘要由CSDN通过智能技术生成

1、基本介绍

Package http provides HTTP client and server implementations.
net/http标准库实现了客户端和服务器。里面有两个重要的类型Client和Server,还有Request和Response类型。goweb框架都是基于net/http标准库实现的。

在这里插入图片描述
在这里插入图片描述

2、Get请求

通过包中的Get函数能够直接获取响应数据。

package https

import (
	"encoding/json"
	"fmt"
	"io"
	"log"
	"net/http"
	"net/url"
)

// 1、测试http.Get
func TestGet() {

	url := "http://apis.juhe.cn/simpleWeather/query?key=087d7d10f700d20e27bb753cd806e40b&city=北京"

	// 向url发送一个请求,并且获取响应Response
	res, err := http.Get(url)
	if err != nil {
		log.Fatalf("err")
	}
	defer res.Body.Close()

	body, _ := io.ReadAll(res.Body) // 读取全部数据
	fmt.Printf("body: %v\n", string(body))
}

// 2、Get请求,把一些参数做成变量,而不是拼接在url后面
func TestGetPara() {

	params := url.Values{}
	URL, err := url.Parse("http://apis.juhe.cn/simpleWeather/query")
	if err != nil {
		return
	}

	params.Set("key", "087d7d10f700d20e27bb753cd806e40b")
	params.Set("city", "北京")

	// 如果参数中中文参数,这个方法会进行URLEncode
	URL.RawQuery = params.Encode()
	urlPath := URL.String()

	fmt.Println(urlPath)

	// 发送Get请求
	response, err := http.Get(urlPath)
	if err != nil {
		log.Fatal("err")
	}
	defer response.Body.Close()

	body, _ := io.ReadAll(response.Body)
	fmt.Println("body: ", string(body))
}

// 3、解析json类型的返回结果
func TestJson() {

	// 预定义一个结构体
	type container struct {
		Args    string            `json:"args`
		Headers map[string]string `json:"headers`
		Origin  string            `json:"origin`
		Url     string            `json:"url"`
	}

	response, err := http.Get("http://httpbin.org/get")
	if err != nil {
		return
	}
	defer response.Body.Close()

	body, _ := io.ReadAll(response.Body)
	fmt.Println(string(body))

	var result container
	json.Unmarshal(body, &result) // 反序列化,结果的json数据转结构体
	fmt.Printf("%#v", result)
}

在这里插入图片描述

3、Post请求

通过PostForm和Post函数发送Post请求。

// Post请求PostForm函数使用
func TestPost() {

	path := "http://apis.juhe.cn/simpleWeather/query"
	urlValues := url.Values{}
	urlValues.Add("key", "087d7d10f700d20e27bb753cd806e40b")
	urlValues.Add("city", "北京")

	// 发送Post请求,Post是用于提交数据的请求方式,多用于表单
	result, err := http.PostForm(path, urlValues)
	if err != nil {
		log.Fatal("err")
	}
	defer result.Body.Close()

	body, _ := io.ReadAll(result.Body)
	fmt.Println(string(body))
}

// Post请求的另一种方式Post函数使用
func TestPost2() {

	urlValues := url.Values{
		"username": {"百里守约"},
		"age":      {"20"},
	}

	reqBody := urlValues.Encode() //解析中文

	// Post函数,第一个是地址,第二个是文本类型,第三个是Reader对象,读取请求体(表单数据)
	response, _ := http.Post("http://httpbin.org/post", "text/html", strings.NewReader(reqBody))
	body, _ := io.ReadAll(response.Body)
	fmt.Println(string(body))
}

// 发送Json数据的Post请求
func TestPostJson() {

	data := make(map[string]interface{})
	data["site"] = "www.baidu.com"
	data["name"] = "马化腾"

	byteData, _ := json.Marshal(data) // 序列化操作
	response, _ := http.Post("http://httpbin.org/post", "application/json", bytes.NewReader(byteData))
	body, _ := io.ReadAll(response.Body)
	fmt.Println(string(body))
}

4、使用Client类型自定义请求

当需要模拟浏览器客户端,比如爬虫的时候就需要使用。

func TestClient() {

	client := &http.Client{
		Timeout: time.Second * 3,
	}

	url := "http://apis.juhe.cn/simpleWeather/query?key=087d7d10f700d20e27bb753cd806e40b&city=北京"
	request, err := http.NewRequest(http.MethodGet, url, nil)
	if err != nil {
		log.Fatal("err")
	}
	// 添加请求头信息
	request.Header.Add("referer", "http://apis.juhe.cn/")

	// Do 发送 HTTP 请求并返回 HTTP 响应,遵循客户端上配置的策略(例如重定向、cookie、身份验证)。
	response, err2 := client.Do(request)
	if err2 != nil {
		log.Fatal("err2")
	}
	defer response.Body.Close()

	// 读取请求体的所有内容
	body, _ := io.ReadAll(response.Body)
	fmt.Printf("body: %v\n", string(body))

}

5、服务端

func TestHttpServer() {

	// 请求处理函数
	// 第一参数是往请求的客户端写数据的流对象,第二个则是监测到的请求对象
	caller := func(response http.ResponseWriter, request *http.Request) {

		// 读取当前路径下的http.html文件,然后将其相应给客户端
		file, err := os.OpenFile("F:/tools/golang/goweb/https/http.html", os.O_RDONLY, 0600)
		if err != nil {
			log.Fatal("err")
		}
		defer file.Close()
		bytedata, _ := io.ReadAll(file) // 读取文件中的所有数据

		io.WriteString(response, string(bytedata))
	}

	/// 响应路径
	http.HandleFunc("/hello", caller)
	// 设置监听端口,并监听
	err := http.ListenAndServe(":8888", nil)
	if err != nil {
		log.Fatal("err")
	}
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值