在使用PHP進行Web開發的過程中,常常需要使用curl這個庫來發送HTTP請求,與其他API進行交互。然而,在調試過程中會遇到一些問題。為了更有效地進行調試,使用curl調試模式可以幫助我們捕獲關鍵信息并快速解決問題。
那么,什么是curl調試模式呢?簡單來說,這是一種通過在命令行中運行curl命令來獲取HTTP請求/響應的詳細信息的方法。接下來,我們將介紹如何使用curl調試模式以及它的一些常見用法。
1. 啟用curl調試模式
要啟用curl調試模式,只需要將 curl 命令加上 -v 選項即可。例如,我們想要發送一個 GET 請求到 https://www.example.com:
curl -v https://www.example.com這時,會得到類似如下的輸出:
* Trying 93.184.216.34:443... * TCP_NODELAY set * Connected to www.example.com (93.184.216.34) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH * successfully set certificate verify locations: * CAfile: /etc/ssl/certs/ca-certificates.crt CApath: none * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS handshake, Certificate (11): * TLSv1.2 (IN), TLS handshake, Server key exchange (12): * TLSv1.2 (IN), TLS handshake, Server finished (14): * TLSv1.2 (OUT), TLS handshake, Client key exchange (16): * TLSv1.2 (OUT), TLS change cipher, Client hello (1): * TLSv1.2 (OUT), TLS handshake, Finished (20): * TLSv1.2 (IN), TLS handshake, Finished (20): * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 * ALPN, server did not agree to a protocol * Server certificate: * subject: C=US; ST=California; L=Los Angeles; O=Internet Corporation for Assigned Names and Numbers; CN=www.example.org * start date: Apr 1 00:00:00 2018 GMT * expire date: Apr 1 23:59:59 2020 GMT * subjectAltName: host "www.example.com" matched cert's "www.example.com" * issuer: C=US; O=DigiCert Inc; CN=DigiCert SHA2 High Assurance Server CA * SSL certificate verify ok. >GET / HTTP/1.1 >Host: www.example.com >User-Agent: curl/7.54.0 >Accept: */* >< HTTP/1.1 200 OK< Cache-Control: max-age=604800< Content-Type: text/html; charset=UTF-8< Date: Wed, 25 Sep 2019 07:48:50 GMT< Etag: "1541025663"< Expires: Wed, 02 Oct 2019 07:48:50 GMT< Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT< Server: ECS (dca/249A)< Vary: Accept-Encoding< X-Cache: HIT< Content-Length: 1270< { [1270 bytes data] * Connection #0 to host www.example.com left intact這里,每一行前都帶有 * 開頭。首先,curl 嘗試建立與 www.example.com 的 TCP 連接,然后發起 TLS 握手。之后,向服務器發送 HTTP 請求,收到響應后打印出來。在響應頭下面,我們可以看到返回的 HTML 代碼。 2. 設置請求頭 有時候我們需要在 HTTP 請求的 header 里添加一些自定義信息。通過 curl 命令的 -H 選項即可完成。以發送一條攜帶自定義 User-Agent 的 GET 請求為例:
curl -v -H 'User-Agent: MyClient/1.0' https://www.example.com這里,我們使用了 -H 'User-Agent: MyClient/1.0' 選項來指定 User-Agent 信息,也可以添加其他的請求頭。 3. 設置請求方法 默認情況下,curl 發送的 HTTP 請求方法為 GET。如果需要發送 POST 請求,則需要通過 -X 選項來指定請求方法:
curl -v -X POST https://www.example.com4. 設置請求體 有時候,我們需要向服務器發送一些數據,例如表單提交。此時,可以通過 -d 選項來設置請求體:
curl -v -d 'name=John&age=20' https://www.example.com這里,我們向服務器發送了一條 POST 請求,并在請求體中添加了表單數據。 5. 跟蹤重定向 當發送的 HTTP 請求遇到重定向時,curl 默認不會跟蹤重定向。如果想要跟蹤重定向并獲取所有信息,需要通過 -L 選項來開啟:
curl -v -L https://www.example.com在這里,我們向 www.example.com 發起 GET 請求,如果收到 3xx 類 HTTP 響應碼,curl 會自動跟蹤重定向。通過添加 -L 選項,我們可以看到每個請求的詳細信息。 6. HTTPS 證書驗證 curl 默認會驗證 HTTPS 的證書。如果使用的是自簽名證書,可能會因為驗證不通過而無法建立連接。在開發和測試環境中,我們通常使用未經驗證的自簽名證書,這時需要通過 -k 選項來關閉證書驗證:
curl -v -k https://www.example.com這里,我們向 www.example.com 發送 HTTP 請求,但不驗證 HTTPS 證書。 在實際開發中,將 curl 命令直接復制到命令行中執行比較繁瑣。可以將 curl 命令封裝成一個函數,以便在 PHP 代碼中調用。例如:
function curl ($url, $method = 'GET', $data = null, $headers = []) { $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL =>$url, CURLOPT_RETURNTRANSFER =>true, CURLOPT_FOLLOWLOCATION =>true, CURLOPT_CUSTOMREQUEST =>$method, CURLOPT_POSTFIELDS =>$data, CURLOPT_HTTPHEADER =>$headers, CURLOPT_HEADER =>true, ]); $response = curl_exec($ch); $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); curl_close($ch); $headers = substr($response, 0, $header_size); $body = substr($response, $header_size); return compact('headers', 'body'); }以上代碼將 curl 封裝為一個函數,接收參數包括請求 URL、請求方法、請求體、請求頭。調用后,返回包括響應頭和響應體的數組。 總結 在本文中,我們介紹了如何使用 curl 調試模式,并通過一些例子介紹了 curl 命令的一些常用選項。在開發和測試過程中,這些技巧能夠幫助我們更有效地解決問題,并更好地理解 HTTP 請求和響應的過程。