在net/http
包中提供了一个被称为Client
的结构体,该结构体位于库文件的src/net/http/client.go
文件中,常见使用场景一般是做go web
开发过程中对接第三方的api
接口(常见的比如微信授权获取手机号码等),爬虫领域的使用
在Client
这个结构体中已经帮我们实现了比较常见的Get
和Post
请求,如果你要使用Delete
等别的请求方式就要使用原生的http.NewRequest
,其中Get
和Post
只是官方帮我们封装了,底层还是使用的http.NewRequest
来实现的
Get
请求这里使用微信官方比较常见的接口,获取accountToken
定义返回的结构体
// AccessTokenResponse 获取token的结构体
type AccessTokenResponse struct {
AccessToken string `json:"access_token"` // token
ExpiresIn int `json:"expires_in"` // 过期时间
}
简单的代码实现
// GetAccessToken 根据appid和secret获取access_token
func GetAccessToken(appId, secret string) string {
url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", appId, secret)
response, err := http.Get(url)
if err != nil {
fmt.println(fmt.Sprintf("获取access_token数据失败:【%s】", err.Error()))
}
defer func() {
if err1 := response.Body.Close(); err1 != nil {
return
}
}()
var result AccessTokenResponse
err = json.NewDecoder(response.Body).Decode(&result)
if err != nil {
fmt.println("获取access_token数据转码失败")
}
return result.AccessToken
}
post
请求1、第一步还是根据get
的方式获取accountToken
2、定义数据结构
type MobileRequest struct {
Code string `json:"code"`
}
type PhomeWatermark struct {
Appid string `json:"appid"`
Timestamp int64 `json:"timestamp"`
}
type PhoneInfoResponse struct {
CountryCode string `json:"countryCode"`
PhoneNumber string `json:"phoneNumber"`
PurePhoneNumber string `json:"purePhoneNumber"`
Watermark PhomeWatermark `json:"watermark"`
}
type MobileByCodeResponse struct {
ErrorCode int `json:"errcode"`
Errmsg string `json:"errmsg"`
PhoneInfo PhoneInfoResponse `json:"phone_info"`
}
3、使用post
发送请求到微信服务器端获取到手机号码
// GetMobileByCode 根据code获取解密手机号码
func GetMobileByCode(accountToken, code string) MobileByCodeResponse {
// 后端文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/phonenumber/phonenumber.getPhoneNumber.html
url := fmt.Sprintf("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s", accountToken)
mobileRequest := MobileRequest{
Code: code,
}
jsonBody, jsonErr := json.Marshal(mobileRequest)
if jsonErr != nil {
fmt.println("根据code获取手机号码失败")
}
response, err := http.Post(url, "application/json; charset=utf-8", bytes.NewReader(jsonBody))
if err != nil {
fmt.println("根据code获取手机号码,请求失败")
}
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
fmt.println("根据code获取手机号码,关闭请求失败")
}
}(response.Body)
var mobileResponse MobileByCodeResponse
if err := json.NewDecoder(response.Body).Decode(&mobileResponse); err != nil {
fmt.println("根据code获取手机号码,解密失败")
}
fmt.Println(utils.MapToJson(mobileResponse), "查询结果")
return mobileResponse
}
http.NewRequest
发送post
请求这里使用创蓝发送短信来使用,参考地址
简单的代码实现
// SendSms 发送手机短信
func (s Sms) SendSms(mobile, template string) error {
params := make(map[string]interface{})
//请登录zz.253.com获取API账号、密码以及短信发送的URL
params["account"] = s.Account //创蓝API账号
params["password"] = s.Password //创蓝API密码
params["phone"] = mobile //手机号码
//设置您要发送的内容:其中“【】”中括号为运营商签名符号,多签名内容前置添加提交
params["msg"] = url.QueryEscape(template)
params["report"] = "true"
bytesData, err := json.Marshal(params)
if err != nil {
fmt.Println(err.Error())
return errors.New(err.Error())
}
reader := bytes.NewReader(bytesData)
//短信发送URL
smsUrl := fmt.Sprintf("http://%s/%s", s.Host, "/msg/send/json")
request, err := http.NewRequest("POST", smsUrl, reader)
if err != nil {
fmt.Println(err.Error())
return errors.New(err.Error())
}
request.Header.Set("Content-Type", "application/json;charset=UTF-8")
client := http.Client{}
resp, err := client.Do(request)
if err != nil {
fmt.Println(err.Error())
return errors.New(err.Error())
}
var smsResponse = make(map[string]interface{})
err = json.NewDecoder(resp.Body).Decode(&smsResponse)
if err != nil {
fmt.Println("转码失败")
return errors.New(err.Error())
}
fmt.Println("发送短信结果", smsResponse)
if smsResponse["code"] == "0" {
return nil
} else {
// 接口数据类型断言成字符类型
message := smsResponse["errorMsg"]
result, _ := message.(string)
return errors.New(result)
}
}
上面发送短信的代码可以参考,使用go面向对象的方式来重写官方的代码
对于其他的PUT
和DELETE
使用方式和上面一样的