PHP轉Go系列 | GET 和 POST 請求的使用姿勢

来源:https://www.cnblogs.com/yxhblogs/p/18267989
-Advertisement-
Play Games

大家好,我是碼農先森。 說到 HTTP 請求工具想必對我們做 Web 開發的程式員都不陌生,只要涉及到網路請求都必須使用。對於我們 PHP 程式員來說,最熟悉不過的就是 CURL 擴展,只要安裝的這個擴展便可隨意發起 HTTP 請求。 但在 PHP 語言中還有一個很好用的 Composer 包「gu ...


大家好,我是碼農先森。

說到 HTTP 請求工具想必對我們做 Web 開發的程式員都不陌生,只要涉及到網路請求都必須使用。對於我們 PHP 程式員來說,最熟悉不過的就是 CURL 擴展,只要安裝的這個擴展便可隨意發起 HTTP 請求。 但在 PHP 語言中還有一個很好用的 Composer 包「guzzlehttp/guzzle」,相信大家只要做 PHP 開發的都接觸過。

轉到 Go 語言後,有些人也會在想 Go 中有沒有這樣的工具包呢?說實話,我從事 Go 語言開發這麼挺久,也始終沒有發現有類似 guzzle 這麼好用的工具包。我想其中的原因可能是 Go 語言的官方標準庫中提供了「net/http」工具,這個也能滿足日常的開發需求,大家也就沒有想再造輪子的興趣了。話不多說,接下來我們開始介紹在 PHP 語言和 Go 語言中的使用姿勢。

在 php_http 目錄下中使用 Composer 命令安裝 guzzle 包。

[manongsen@root ~]$ pwd
/home/manongsen/workspace/php_to_go/php_http
[manongsen@root php_http]$ composer require guzzlehttp/guzzle

在 go_http 目錄下中使用 go mod init 初始化 Go 項目。

[manongsen@root ~]$ pwd
/home/manongsen/workspace/php_to_go/go_http
[manongsen@root go_http]$ go mod init go_http

這是初始化完成後的項目結構。

[manongsen@root php_to_go]$ tree -L 2
.
├── README.md
├── go_http
│   ├── go.mod
│   ├── go.sum
│   └── main.go
└── php_http
    ├── composer.json
    ├── composer.lock
    ├── index.php
    └── vendor

這次我們主要介紹最常用的兩種請求方法,分別是 GET 請求和 POST 請求。

在 PHP 中先通過 require 載入到 GuzzleHttp 類庫,然後實例化 \GuzzleHttp\Client 類,並通過構造函數設置 base_uri 和 timeout 參數,再基於 $client 對象發起 GET 請求和 POST 請求,在使用過程中需要註意捕獲異常情況。

// php_to_go/php_http/index.php
<?php

require 'vendor/autoload.php'; 

try {
    // 構建請求客戶端
    $client = new GuzzleHttp\Client([
        // 設置基礎的請求地址
        'base_uri' => 'https://www.baidu.com',
        // 設置超時時間
        'timeout'  => 3.0,
    ]);

     // -----------------GET 請求-----------------------
    $response = $client->request('GET', '/', [
        'query' => ['wd' => 'php'] // 設置搜索參數
    ]);
    // 獲取 HTTP 響應狀態碼
    print_r($response->getStatusCode()); 
    // 獲取 HTTP 響應數據體
    print_r($response->getBody()); 

    // -----------------POST 請求-----------------------
    $response = $client->request('POST', '/', [
        'json' => ['wd' => 'php'] // 設置搜索參數
    ]);
    // 獲取 HTTP 響應狀態碼
    print_r($response->getStatusCode()); 
    // 獲取 HTTP 響應數據體
    print_r($response->getBody()); 
} catch (GuzzleHttp\Exception\RequestException $e) {
    // 捕獲請求異常
    echo "Error: " . $e->getMessage();
}

從上面的代碼可以看出在 PHP 中發起 HTTP 請求使用起來還是很簡單的。那麼在 Go 中 GET 和 POST 的使用方法是怎樣的呢?從下麵的代碼量上來看就要多很多了,先要 import 相關的標準庫,比如 net/http、encoding/json 等。

其次定義一個 http.Client{} 結構體的對象,並且設置 HTTP 請求的超時時間。然後再調用 client.Get() 或 client.Post() 方法來發起 GET 及 Post 請求。最後再使用 ioutil.ReadAll 方法從 response.Body 網路數據流中讀取出 HTTP 請求體數據,讀取完數據之後要記得關閉資源。這裡需要註意的一點是 response.Body 網路數據流是不能重覆讀取,初學者這裡是容易犯錯的點。

// php_to_go/go_http/main.go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
	"time"
)

func main() {
	// 定義 基礎的請求地址
	baseUrl := "https://www.baidu.com"

	// 創建一個 HTTP 客戶端
	client := &http.Client{
		Timeout: 3 * time.Second, // 設置超時時間為 3 秒
	}

	// ----------------------GET請求--------------------------
	// 構建請求參數
	params := url.Values{}
	params.Add("wd", "go")

	// 發起 GET 請求
	response, err := client.Get(baseUrl + params.Encode())
	if err != nil {
		fmt.Printf("發起請求時出現錯誤: %v\n", err)
		return
	}
	// 關閉資源 防止資源泄露
	defer response.Body.Close()

	// 讀取 HTTP 響應體數據
	body, err := ioutil.ReadAll(response.Body)
	if err != nil {
		fmt.Printf("讀取響應時出現錯誤: %v\n", err)
		return
	}

	// 輸出 HTTP 響應狀態碼
	fmt.Printf("status: %v\n", response.Status)
	// 輸出 HTTP 響應體數據
	fmt.Printf("body: %v\n", string(body))

	// ----------------------POST請求--------------------------
	// 定義請求的參數
	reqParams := map[string]string{
		"wd": "go",
	}
	jsonData, err := json.Marshal(reqParams)
	if err != nil {
		fmt.Printf("JSON 編碼錯誤: %v", err)
		return
	}

	// 創建一個新的位元組緩衝區並將 jsonData 數據放入緩存區
	reqBody := bytes.NewBuffer(jsonData)

	// 發起 POST 請求,請求的內容格式為 JSON 格式
	response, err = client.Post(baseUrl, "application/json", reqBody)
	if err != nil {
		fmt.Printf("發起請求時出現錯誤: %v", err)
		return
	}
	// 關閉資源 防止資源泄露
	defer response.Body.Close()

	// 讀取 HTTP 響應體數據
	body, err = ioutil.ReadAll(response.Body)
	if err != nil {
		fmt.Printf("讀取響應時出現錯誤: %v", err)
		return
	}

	// 輸出 HTTP 響應狀態碼
	fmt.Printf("status: %v\n", response.Status)
	// 輸出 HTTP 響應體數據
	fmt.Printf("body: %v\n", string(body))
}

從使用的角度來看 PHP 比 Go 要簡單的多,異常捕獲使用 try catch{} 即可,反觀 Go 中要通過 if != err {} 來反覆的判斷是否有錯誤,略顯繁瑣。同時在這個例子中也就可以看得出 php 的開發效率比 go 要快的多,go 中要時刻註意變數的類型、數據的讀取、資源的關閉等情況,php 則一梭子就開發完了。

但 Go 的執行效率可比 PHP 高的多,Go 作為靜態語言直接打包成了二進位可執行文件,而 PHP 是動態語言執行時才開始解析代碼。因此兩者剛好互補,學習 Go 也更利於我們 PHPer 瞭解系統資源、網路請求、緩存區等的使用方式,這些都是在 PHP 中很少能接觸到的。

對於 HTTP 工具的使用姿勢,其實最重要的是要掌握 Header 頭各種參數的配置,比如 Content-Type、Proxy、Authorization、Cookies、Cert 等,那麼我這裡在把 GuzzleHttp 和 net/http 的官方文檔附上,方便大家更加深入的學習。

推薦


歡迎關註、分享、點贊、收藏、在看,我是微信公眾號「碼農先森」作者。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Tex類繼承自MathTex,具體功能和MathTex差不多,有一些細節的差別。在實際的使用中,我感覺Tex在結合一般文本和公式時更方便一些,所以我用的比較多的是Tex。Tex在manim各個模塊中的位置大致如上圖中所示。 1. Tex與MathTex區別 Tex的主要參數和方法和MathTex是一 ...
  • 應用場景:需要創建純色圖像,作為背景圖, 在此基礎上添加文字、形狀、新的圖片等等 原理: cv2的讀取圖片操作本質上是將圖片轉換為uint8的numpy.ndarray類型, 後續的其他圖像操作,本質上也是對於這個ndarray對象的操作 首先用numpy創建一個形狀為(224,224,3)、元素值 ...
  • Markdown 憑藉其簡潔易用的特性,成為創建和編輯純文本文檔的常用選擇。但某些時候我們需要更加精緻的展示效果,例如在專業分享文檔或列印成離線使用的紙質版時,就需要將Markdown文件以其他固定的文檔格式呈現。通過將 Markdown 轉換為 Word 和 PDF 格式,可以得到更多的格式設置, ...
  • 項目隨筆-【大事件(文章類)】 自定義參數校驗註解 需要寫一個自定義註解Xxx+校驗規則的類XxxValidation【需要繼承ConstraintValidator】 自定義註解 @Documented @Target(ElementType.FIELD) @Retention(Retention ...
  • Python 是一種面向對象、解釋型電腦程式設計語言,由 Guido van Rossum 於 1989 年底發明,第一個公開發行版發行於 1991 年。Python 語法簡潔而清晰,具有豐富和強大的類庫。它常被昵稱為膠水語言,能夠把用其他語言製作的各種模塊(尤其是 C/C++)很輕鬆地聯結在一起 ...
  • 正文 昨天睡了一天覺,今天看了一天《三體》電視劇。真是墮落到沒邊了呢(笑。本來想寫代碼完成年度計劃,或者多寫幾篇文章,但實在不想寫,也不想動筆。 感覺這個周末什麼都沒做呢,休息倒是休息好了。 今天 30 號,也不知道靈平安到學校沒有。 本有一些想寫的東西,但懶得動筆了。 成功日記: 《西游記》看到了 ...
  • 前言 之前做了微信登錄,所以總結一下微信授權登錄並獲取用戶信息這個功能的開發流程。 配置 1.首先得在微信公眾平臺申請一下微信小程式賬號並獲取到小程式的AppID和AppSecret https://mp.weixin.qq.com/cgi-bin/loginpage?url=%2Fwxamp%2F ...
  • 本文揭秘了Java Chassis 3流式響應的使用場景和技術背景,它基於伺服器事件推送和響應式流(reactive streams)標準,提供了非常簡潔的流式響應開發能力,簡化人工智慧應用開發體驗。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...