最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang http請求封裝的代碼示例

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

1、POST請求

1.1、POST請求發(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請求

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請求

看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è)置請求頭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請求發(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請求發(fā)送form

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

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請求

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、測試

這里服務(wù)端筆者使用springboot項目創(chuà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測試代碼

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

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

(1)、測試HttpPostJson方法

func TestHttpPostJson(t *testing.T) {
	url := "http://localhost:8080/json/add"
	var user = User{
		Name: "舉頭西北浮云,倚天萬里須長劍,人言此地,夜深長見,斗牛光焰",
		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)
}

運行效果

(2)、測試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)
}

運行效果

(3)、測試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)
}

運行效果

(4)、測試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{"相思字,空盈幅,相思意,何時足"}
	form["age"] = []string{"18"}
	response, er := HttpPostHeaderForm(url, header, form)
	if er != nil {
		fmt.Println(er)
	}
	fmt.Println(response)
}

運行效果

(5)、測試HttpGet方法

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

運行效果

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

相關(guān)文章

  • 圖文詳解Go程序如何編譯并運行起來的

    圖文詳解Go程序如何編譯并運行起來的

    Go語言這兩年在語言排行榜上的上升勢頭非常猛,Go語言雖然是靜態(tài)編譯型語言,但是它卻擁有腳本化的語法,下面這篇文章主要給大家介紹了關(guān)于Go程序如何編譯并運行起來的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • Ubuntu下安裝Go語言開發(fā)環(huán)境及編輯器的相關(guān)配置

    Ubuntu下安裝Go語言開發(fā)環(huán)境及編輯器的相關(guān)配置

    這篇文章主要介紹了Ubuntu下安裝Go語言開發(fā)環(huán)境及編輯器的相關(guān)配置,編輯器方面介紹了包括Vim和Eclipse,需要的朋友可以參考下
    2016-02-02
  • Golang執(zhí)行cmd命令行的方法

    Golang執(zhí)行cmd命令行的方法

    本文主要介紹了Golang執(zhí)行cmd命令行的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Golang使用sqlx操作sqlite3數(shù)據(jù)庫的完整指南

    Golang使用sqlx操作sqlite3數(shù)據(jù)庫的完整指南

    這篇文章主要為大家詳細(xì)介紹了Golang使用sqlx操作sqlite3數(shù)據(jù)庫的相關(guān)知識,本文會結(jié)合sqlx給出一些操作數(shù)據(jù)庫的示例,并將常見功能封裝了函數(shù)接口形式,希望對大家有所幫助
    2025-12-12
  • go如何刪除字符串中的部分字符

    go如何刪除字符串中的部分字符

    這篇文章主要介紹了go刪除字符串中的部分字符操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Golang?Makefile示例深入講解使用

    Golang?Makefile示例深入講解使用

    一次偶然的機(jī)會,在?github?上看到有人用?Makefile,就嘗試了一下,發(fā)現(xiàn)真的非常合適,Makefile?本身就是用來描述依賴的,可讀性非常好,而且與強(qiáng)大的?shell?結(jié)合在一起,基本可以實現(xiàn)任何想要的功能
    2023-01-01
  • Go gRPC超時控制Deadlines用法詳解

    Go gRPC超時控制Deadlines用法詳解

    這篇文章主要為大家介紹了Go gRPC超時控制Deadlines用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go語言協(xié)程池的實現(xiàn)示例

    Go語言協(xié)程池的實現(xiàn)示例

    本文主要介紹了Go語言協(xié)程池的原理與實現(xiàn),通過限制goroutine數(shù)量避免性能下降,及通過AddTask和Run方法管理任務(wù)分配,確保并發(fā)控制,提升系統(tǒng)穩(wěn)定性,感興趣的可以了解一下
    2025-09-09
  • golang反向代理設(shè)置host不生效的問題解決

    golang反向代理設(shè)置host不生效的問題解決

    在使用golang的httputil做反向代理的時候,發(fā)現(xiàn)一個奇怪的現(xiàn)象,上游網(wǎng)關(guān)必須要設(shè)置host才行,不設(shè)置host的話,golang服務(wù)反向代理請求下游會出現(xiàn)http 503錯誤,接下來通過本文給大家介紹golang反向代理設(shè)置host不生效問題,感興趣的朋友一起看看吧
    2023-05-05
  • Go工具鏈之go tool fix用法詳解

    Go工具鏈之go tool fix用法詳解

    go tool fix 是 Go 工具鏈中的一個命令,作用是把指定 Go 程序代碼包中的的所有舊版本代碼修正為新版本的代碼,本文將簡單介紹一下go tool fix的使用方法,感興趣的小伙伴可以參考閱讀下
    2023-07-07

最新評論

西乡县| 定襄县| 和顺县| 延安市| 清涧县| 东方市| 咸宁市| 象山县| 宁都县| 鱼台县| 赤水市| 铜梁县| 永安市| 外汇| 县级市| 陇南市| 贡觉县| 方城县| 英超| 施秉县| 通化市| 米脂县| 寻乌县| 西安市| 延寿县| 峡江县| 通道| 铜鼓县| 平安县| 邳州市| 通海县| 方山县| 东明县| 呈贡县| 福海县| 滨海县| 无棣县| 武山县| 祁阳县| 盐亭县| 嘉义市|