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

使用golang開發(fā)一個(gè)curl命令行工具

 更新時(shí)間:2023年11月21日 14:01:49   作者:shura1014  
這篇文章主要為大家詳細(xì)介紹了如何使用golang開發(fā)一個(gè)簡(jiǎn)單的curl命令行工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

本文主要介紹如何使用go編寫一個(gè)命令行工具,具體一些細(xì)節(jié)不在本文分析

編寫一個(gè)簡(jiǎn)單的curl命令行工具

使用到go的 flag庫(kù)

例如

第一個(gè)參數(shù)為命令行參數(shù),第二個(gè)默認(rèn)值GET 第三個(gè)usage提示輸入信息

flag.String(“X”, “GET”, “GET POST”)

代碼如下

package main

import (
	"bufio"
	"bytes"
	"encoding/json"
	"errors"
	"flag"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"time"
)

func main() {

	// 命令行參數(shù) 參數(shù)名稱前面加個(gè) -
    // 第一個(gè)參數(shù)為命令行參數(shù),第二個(gè)默認(rèn)值GET 第三個(gè)usage提示信息 
	method := flag.String("X", "GET", "GET POST")
	// 如果時(shí)GET請(qǐng)求不需要寫body
	body := flag.String("d", "{}", "json format")
	flag.Parse()

	// 沒有 - 的參數(shù),但是需要放到最末尾
	args := flag.Args()
	if len(args) != 1 {
		// 約定只有一個(gè)這樣子的參數(shù),且必須是url
		fmt.Println("No parameter is passed, the url must be passed at the end")
		return
	}
	// 創(chuàng)建一個(gè)httpclient
	client := NewHttpClient()

	switch *method {
	// 只做GET POST支持
	case "POST", "GET":
		// 將body參數(shù)轉(zhuǎn)成map 必須要是json格式
		param := make(map[string]any)
		err := json.Unmarshal([]byte(*body), &param)
		if err != nil {
			fmt.Println("Json format is not valid", err.Error())
			return
		}

		data, err := client.Json(*method, args[0], param)
		if err != nil {
			fmt.Println(err.Error())
			return
		}
		// json格式化打印
		result := bytes.Buffer{}
		_ = json.Indent(&result, data, "", "\t")
		fmt.Println(result.String())
	default:
		fmt.Printf("No support %s", *method)
		return
	}
}

// HttpClient http客戶端
type HttpClient struct {
	client  http.Client
	Address string
}

func NewHttpClient() *HttpClient {
	client := http.Client{
		Timeout: time.Duration(3) * time.Second,
		Transport: &http.Transport{
			MaxIdleConnsPerHost:   5,
			MaxConnsPerHost:       100,
			IdleConnTimeout:       90 * time.Second,
			TLSHandshakeTimeout:   10 * time.Second,
			ExpectContinueTimeout: 1 * time.Second,
		},
	}
	return &HttpClient{client: client}
}

// Json 接收json格式返回
func (c *HttpClient) Json(method string, url string, args map[string]any) ([]byte, error) {
	jsonStr, _ := json.Marshal(args)
	req, err := http.NewRequest(method, url, bytes.NewReader(jsonStr))
	req.Header.Set("Content-Type", "application/json")
	if err != nil {
		return nil, err
	}
	return c.handleResponse(req)
}

func (c *HttpClient) handleResponse(req *http.Request) ([]byte, error) {
	// go原生方法 執(zhí)行http請(qǐng)求
	response, err := c.client.Do(req)
	if err != nil {
		return nil, err
	}

	if response.StatusCode != http.StatusOK {
		return nil, errors.New(fmt.Sprintf("response code is %d", response.StatusCode))
	}

	// 以帶緩沖字節(jié)的方式讀取body 與其它語(yǔ)言類似
	buff := make([]byte, 128)
	var body []byte
	reader := bufio.NewReader(response.Body)
	for {
		n, err := reader.Read(buff)

		if err != nil && err != io.EOF {
			return nil, err
		}

		body = append(body, buff[:n]...)

		// 讀完了
		if err == io.EOF || n == 0 {
			break
		}

		if n < 128 {
			break
		}

	}
	defer response.Body.Close()
	return body, nil
}

// 將map轉(zhuǎn)成go中的url.Values
func (c *HttpClient) toValues(args map[string]any) string {
	if args != nil && len(args) > 0 {
		params := url.Values{}
		for k, v := range args {
			params.Set(k, fmt.Sprintf("%v", v))
		}
		return params.Encode()
	}
	return ""
}

打開終端命令行執(zhí)行 go build -o gocurl.exe .

會(huì)在當(dāng)前項(xiàng)目生成 gocurl.exe的windows可執(zhí)行文件,如果時(shí)其它操作系統(tǒng)可以起其它后綴

D:\GoProject\curl> go build  -o gocurl.exe  .                                         

幫助信息 --help 或者 -h

準(zhǔn)備兩個(gè)服務(wù)

一個(gè)GET請(qǐng)求一個(gè)POST,這里需要大家自己準(zhǔn)備,我這里準(zhǔn)備的兩個(gè)服務(wù)postman調(diào)用結(jié)果如下

測(cè)試

使用終端執(zhí)行g(shù)ocurl.exe

PS D:\GoProject\curl> .\gocurl.exe -X=GET http://localhost:7001/product/get?pid=1001
{
        "code": "200",
        "msg": "ok",
        "data": {
                "pid": "1001",
                "pName": "iphone14-7676",
                "count": 0,
                "PType": ""
        }
}
PS D:\GoProject\curl> .\gocurl.exe -X=POST -d='{\"pid\":\"1002\"}' http://localhost:7001/product/post
{
        "code": "200",
        "msg": "ok",
        "data": {
                "pid": "1002",
                "pName": "iphone14-7676",
                "count": 0,
                "PType": ""
        }
}

好了,一個(gè)簡(jiǎn)單的命令行工具已經(jīng)開法完成。大家也可以嘗試著去開發(fā)自己的小工具。編譯成對(duì)應(yīng)系統(tǒng)的可執(zhí)行文件。比如開發(fā)一個(gè)并發(fā)測(cè)試工具 ab可以并發(fā)請(qǐng)求url并且計(jì)算qps等信息。

到此這篇關(guān)于使用golang開發(fā)一個(gè)curl命令行工具的文章就介紹到這了,更多相關(guān)go命令行工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang簡(jiǎn)單實(shí)現(xiàn)http的server端和client端

    Golang簡(jiǎn)單實(shí)現(xiàn)http的server端和client端

    Http 服務(wù)是基于 Tcp 的應(yīng)用層的實(shí)現(xiàn),也是最常見的網(wǎng)絡(luò)協(xié)議之一。本文主要介紹了Golang簡(jiǎn)單實(shí)現(xiàn)http的server端和client端,感興趣的可以了解一下
    2021-06-06
  • 徹底理解golang中什么是nil

    徹底理解golang中什么是nil

    這篇文章主要介紹了golang中的nil用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 基于Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器

    基于Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了如何基于Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-10-10
  • golang為什么要統(tǒng)一錯(cuò)誤處理

    golang為什么要統(tǒng)一錯(cuò)誤處理

    這篇文章主要介紹了golang為什么要統(tǒng)一錯(cuò)誤處理,統(tǒng)一錯(cuò)誤處理的目的是為了前端開發(fā)接收到后端的statuscode,之后便于前端邏輯上開發(fā)以及開發(fā),下文具體操作過(guò)程需要的小伙伴可以參考一下
    2022-04-04
  • golang中有序Map的實(shí)現(xiàn)

    golang中有序Map的實(shí)現(xiàn)

    Go語(yǔ)言中XContainerOrderedMap庫(kù),解決標(biāo)準(zhǔn)map無(wú)序問題,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • Go實(shí)現(xiàn)Redis連接池方法

    Go實(shí)現(xiàn)Redis連接池方法

    為了更深入了解golang連接池的實(shí)現(xiàn),自已又重寫了一遍連接池。文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • GO語(yǔ)言基礎(chǔ)之?dāng)?shù)組

    GO語(yǔ)言基礎(chǔ)之?dāng)?shù)組

    或許您是從其他語(yǔ)言轉(zhuǎn)到GO語(yǔ)言這邊的,那麼在其他語(yǔ)言的影響下您可能會(huì)不太適應(yīng)GO語(yǔ)言的數(shù)組,因?yàn)镚O語(yǔ)言把數(shù)組給拆分成了array,slice和map,需要的朋友可以參考下
    2015-01-01
  • golang快速實(shí)現(xiàn)網(wǎng)頁(yè)截圖的方法

    golang快速實(shí)現(xiàn)網(wǎng)頁(yè)截圖的方法

    這篇文章主要介紹了golang快速實(shí)現(xiàn)網(wǎng)頁(yè)截圖的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 后端golang項(xiàng)目一鍵打包部署方案

    后端golang項(xiàng)目一鍵打包部署方案

    本文介紹了如何為Go語(yǔ)言Gin項(xiàng)目添加一鍵打包并自動(dòng)部署功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-05-05
  • 讓go程序以后臺(tái)進(jìn)程或daemon方式運(yùn)行方法探究

    讓go程序以后臺(tái)進(jìn)程或daemon方式運(yùn)行方法探究

    本文探討了如何通過(guò)Go代碼實(shí)現(xiàn)在后臺(tái)運(yùn)行的程序,最近我用Go語(yǔ)言開發(fā)了一個(gè)WebSocket服務(wù),我希望它能在后臺(tái)運(yùn)行,并在異常退出時(shí)自動(dòng)重新啟動(dòng),我的整體思路是將程序轉(zhuǎn)為后臺(tái)進(jìn)程,也就是守護(hù)進(jìn)程(daemon)
    2024-01-01

最新評(píng)論

昌乐县| 陕西省| 斗六市| 涡阳县| 军事| 澄江县| 祁东县| 会泽县| 滨海县| 武隆县| 凌海市| 牙克石市| 合江县| 穆棱市| 同德县| 湖州市| 文安县| 文昌市| 武川县| 遂昌县| 昌乐县| 张北县| 闽侯县| 和田市| 南木林县| 玉田县| 荔波县| 庄浪县| 永善县| 北流市| 沁水县| 绥中县| 沙湾县| 杭锦后旗| 蓝山县| 宽城| 天全县| 绿春县| 茂名市| 西峡县| 墨脱县|