欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang http請(qǐng)求封裝的代碼示例

 更新時(shí)間:2023年06月02日 09:19:29   作者:悟世君子  
http請(qǐng)求封裝在項(xiàng)目中非常普遍,下面筆者封裝了http post請(qǐng)求傳json、form 和get請(qǐng)求,以備將來使用,文中代碼示例介紹的非常詳細(xì),需要的朋友可以參考下

1、POST請(qǐng)求

1.1、POST請(qǐng)求發(fā)送 json

這里發(fā)送json筆者使用了2種方式,一種是golang 自帶的 http.Post方法,另一是 http.NewRequest

方法。二者的區(qū)別是http.Post方法不能發(fā)送自定義的header數(shù)據(jù);而http.NewRequest方法可以發(fā)送額外的自定義header數(shù)據(jù)

先看使用golang 自帶的 http.Post方法封裝的POST請(qǐng)求

func HttpPostJson(url string, requestBody []byte) (string, error) {
	response, er := http.Post(url, "application/json", bytes.NewBuffer(requestBody))
	if er != nil {
		return "", er
	}
	defer response.Body.Close()
	body, er2 := ioutil.ReadAll(response.Body)
	if er2 != nil {
		return "", er2
	}
	return string(body), nil
}

再看使用http.NewRequest方法封裝的POST請(qǐng)求

看golang的源代碼可以知道 http.Post方法底層就是使用的 NewRequest 方法,因此NewRequest方法更加靈活

func HttpPost(url string, header map[string]string, requestBody []byte) (string, error) {
	httpClient := &http.Client{}
	request, er := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(requestBody))
	if er != nil {
		return "", er
	}
	for key, value := range header {
		request.Header.Set(key, value)
	}
	//設(shè)置請(qǐng)求頭Content-Type
	request.Header.Set("Content-Type", "application/json")
	response, er2 := httpClient.Do(request)
	if er2 != nil {
		return "", er2
	}
	defer response.Body.Close()
	body, er3 := ioutil.ReadAll(response.Body)
	if er3 != nil {
		return "", er3
	}
	return string(body), nil
}

1.2、POST請(qǐng)求發(fā)送form

form數(shù)據(jù)使用map存放,map的key是字符串,value是字符串切片

func HttpPostForm(url string, form map[string][]string) (string, error) {
	response, er := http.PostForm(url, form)
	if er != nil {
		return "", er
	}
	defer response.Body.Close()
	body, er2 := ioutil.ReadAll(response.Body)
	if er2 != nil {
		return "", er2
	}
	return string(body), nil
}

可以攜帶自定義header的post請(qǐng)求發(fā)送form

筆者使用NewRequest 方法封裝的可以攜帶自定義header的form請(qǐng)求

func HttpPostHeaderForm(requestUrl string, header map[string]string, form map[string][]string) (string, error) {
	httpClient := &http.Client{}
	var data url.Values
	data = map[string][]string{}
	for k, v := range form {
		data[k] = v
	}
	request, er := http.NewRequest(http.MethodPost, requestUrl, strings.NewReader(data.Encode()))
	if er != nil {
		return "", er
	}
	request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
	//設(shè)置自定義header
	for key, value := range header {
		request.Header.Set(key, value)
	}
	response, er := httpClient.Do(request)
	if er != nil {
		return "", er
	}
	defer response.Body.Close()
	body, er2 := ioutil.ReadAll(response.Body)
	if er2 != nil {
		return "", er2
	}
	return string(body), nil
}

2、GET請(qǐng)求

func HttpGet(url string) (string, error) {
	response, er := http.Get(url)
	if er != nil {
		return "", er
	}
	defer response.Body.Close()
	body, er2 := ioutil.ReadAll(response.Body)
	if er2 != nil {
		return "", er2
	}
	return string(body), nil
}

3、測(cè)試

這里服務(wù)端筆者使用springboot項(xiàng)目創(chuàng)建,用來接收請(qǐng)求,端口默認(rèn)8080

參數(shù)類

package com.wsjz.demo.param;
import lombok.Data;
@Data
public class AddParam {
    private String name;
    private Integer age;
}

controller

package com.wsjz.demo.controller;
import com.wsjz.demo.param.AddParam;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
@RestController
public class DemoController {
    @PostMapping("/json/add")
    public String jsonAdd(@RequestBody AddParam param, HttpServletRequest request) {
        System.out.println(request.getHeader("token"));
        System.out.println(param);
        return "json ok";
    }
    @PostMapping("/form/add")
    public String formAdd(AddParam param, HttpServletRequest request) {
        System.out.println(request.getHeader("token"));
        System.out.println(param);
        return "form ok";
    }
    @GetMapping("/get/add")
    public String getAdd(AddParam param) {
        System.out.println(param);
        return "get ok";
    }
}

golang測(cè)試代碼

新建User結(jié)構(gòu)體做為參數(shù)

type User struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

(1)、測(cè)試HttpPostJson方法

func TestHttpPostJson(t *testing.T) {
	url := "http://localhost:8080/json/add"
	var user = User{
		Name: "舉頭西北浮云,倚天萬里須長(zhǎng)劍,人言此地,夜深長(zhǎng)見,斗牛光焰",
		Age:  17,
	}
	requestBody, er := json.Marshal(user)
	if er != nil {
		log.Fatal(er)
	}
	response, er := HttpPostJson(url, requestBody)
	if er != nil {
		fmt.Println(er)
	}
	fmt.Println(response)
}

運(yùn)行效果

(2)、測(cè)試HttpPost方法

func TestHttpPost(t *testing.T) {
	url := "http://localhost:8080/json/add"
	var header = make(map[string]string)
	header["token"] = "2492dc007dfc4ce8adcc8b42b21641f4"
	var user = User{
		Name: "我見青山多嫵媚",
		Age:  17,
	}
	requestBody, er := json.Marshal(user)
	if er != nil {
		log.Fatal(er)
	}
	response, er2 := HttpPost(url, header, requestBody)
	if er2 != nil {
		log.Fatal(er2)
	}
	fmt.Println(response)
}

運(yùn)行效果

(3)、測(cè)試HttpPostForm方法

func TestHttpPostForm(t *testing.T) {
	url := "http://localhost:8080/form/add"
	var form = make(map[string][]string)
	form["name"] = []string{"可憐今夕月,向何處,去悠悠"}
	form["age"] = []string{"18"}
	response, er := HttpPostForm(url, form)
	if er != nil {
		fmt.Println(er)
	}
	fmt.Println(response)
}

運(yùn)行效果

(4)、測(cè)試HttpPostHeaderForm方法

func TestHttpPostHeaderForm(t *testing.T) {
	url := "http://localhost:8080/form/add"
	var header = make(map[string]string)
	header["token"] = "0a8b903b7d7448e3ab007caab081965c"
	var form = make(map[string][]string)
	form["name"] = []string{"相思字,空盈幅,相思意,何時(shí)足"}
	form["age"] = []string{"18"}
	response, er := HttpPostHeaderForm(url, header, form)
	if er != nil {
		fmt.Println(er)
	}
	fmt.Println(response)
}

運(yùn)行效果

(5)、測(cè)試HttpGet方法

func TestHttpGet(t *testing.T) {
	//對(duì)中文進(jìn)行編碼
	name := url.QueryEscape("乘風(fēng)好去,長(zhǎng)空萬里,直下看山河")
	requestUrl := "http://localhost:8080/get/add?name=" + name + "&age=19"
	response, er := HttpGet(requestUrl)
	if er != nil {
		fmt.Println(er)
	}
	fmt.Println(response)
}

運(yùn)行效果

以上就是Golang http請(qǐng)求封裝的代碼示例的詳細(xì)內(nèi)容,更多關(guān)于Golang http請(qǐng)求封裝的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Golang時(shí)間處理庫(kù)go-carbon?v2.2.13發(fā)布細(xì)則

    Golang時(shí)間處理庫(kù)go-carbon?v2.2.13發(fā)布細(xì)則

    這篇文章主要為大家介紹了Golang?時(shí)間處理庫(kù)go-carbon?v2.2.13發(fā)布細(xì)則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 詳解Go中defer與return的執(zhí)行順序

    詳解Go中defer與return的執(zhí)行順序

    Go?defer中改變r(jià)eturn的值會(huì)生效嗎,這就設(shè)計(jì)到了GO語(yǔ)言中defer與return哪個(gè)先執(zhí)行的問題了,下面小編就通過簡(jiǎn)單的示例來和大家講講吧
    2023-07-07
  • 深入理解golang的異常處理機(jī)制

    深入理解golang的異常處理機(jī)制

    Go語(yǔ)言追求簡(jiǎn)潔優(yōu)雅,所以,Go語(yǔ)言不支持傳統(tǒng)的 try…catch…finally 這種異常,下面這篇文章主要給大家介紹了關(guān)于golang的異常處理機(jī)制,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • docker如何安裝部署golang應(yīng)用程序

    docker如何安裝部署golang應(yīng)用程序

    這篇文章主要為大家介紹了docker如何安裝部署golang應(yīng)用程序詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Go語(yǔ)言入門教程之Arrays、Slices、Maps、Range操作簡(jiǎn)明總結(jié)

    Go語(yǔ)言入門教程之Arrays、Slices、Maps、Range操作簡(jiǎn)明總結(jié)

    這篇文章主要介紹了Go語(yǔ)言入門教程之Arrays、Slices、Maps、Range操作簡(jiǎn)明總結(jié),本文直接給出操作代碼,同時(shí)對(duì)代碼加上了詳細(xì)注釋,需要的朋友可以參考下
    2014-11-11
  • Golang文件操作之讀取與寫入方法全攻略

    Golang文件操作之讀取與寫入方法全攻略

    本文詳細(xì)介紹了在Go語(yǔ)言中進(jìn)行文件操作的方法,包括文件的創(chuàng)建、打開、讀取、寫入和關(guān)閉等,解析了使用os、bufio和io包進(jìn)行高效文件操作的技巧,并提供了錯(cuò)誤處理與性能優(yōu)化的建議,以幫助開發(fā)者有效管理文件資源并提升應(yīng)用性能,需要的朋友可以參考下
    2024-11-11
  • Go語(yǔ)言metrics應(yīng)用監(jiān)控指標(biāo)基本使用說明

    Go語(yǔ)言metrics應(yīng)用監(jiān)控指標(biāo)基本使用說明

    這篇文章主要為大家介紹了Go語(yǔ)言metrics應(yīng)用監(jiān)控指標(biāo)的基本使用說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • Go語(yǔ)言調(diào)用其它程序并獲得程序輸出的方法

    Go語(yǔ)言調(diào)用其它程序并獲得程序輸出的方法

    這篇文章主要介紹了Go語(yǔ)言調(diào)用其它程序并獲得程序輸出的方法,實(shí)例分析了Go調(diào)用cmd程序的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • 詳解Go語(yǔ)言如何使用標(biāo)準(zhǔn)庫(kù)sort對(duì)切片進(jìn)行排序

    詳解Go語(yǔ)言如何使用標(biāo)準(zhǔn)庫(kù)sort對(duì)切片進(jìn)行排序

    Sort?標(biāo)準(zhǔn)庫(kù)提供了對(duì)基本數(shù)據(jù)類型的切片和自定義類型的切片進(jìn)行排序的函數(shù)。今天主要分享的內(nèi)容是使用?Go?標(biāo)準(zhǔn)庫(kù)?sort?對(duì)切片進(jìn)行排序,感興趣的可以了解一下
    2022-12-12
  • 手把手教你vscode配置golang開發(fā)環(huán)境的步驟

    手把手教你vscode配置golang開發(fā)環(huán)境的步驟

    這篇文章主要介紹了手把手教你vscode配置golang開發(fā)環(huán)境的步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評(píng)論