cURL簡介:高級程序員都在用的工具
在本教程中,我們介紹cURL的基本選項,并通過示例介紹如何使用它們,然后我們開發(fā)了一個帶有三個端點的Node/Express服務器,以演示如何使用本文介紹的cURL選項對服務器執(zhí)行cURL的GET/POST請求。
與cURL一起使用的選項很多,我們在此介紹的是可用于快速測試API端點的基本選項。
介紹
cURL是一種用于從服務器傳輸數據或向服務器傳輸數據的傳輸工具。它支持各種互聯網傳輸協議,包括:
- DICT
- FILE
- FTP, FTPS
- GOPHER
- HTTP, HTTPS
- IMAP, IMAPS
- LDAP, LDAPS
- POP3, POP3S
- RTMP, RTSP
- SCP, SFTP
- SMB, SMBS
- SMTP, SMTPS
- TELNET and TFTP
我們可以使用cURL執(zhí)行一些有用的技巧,如代理支持、用戶身份驗證、FTP上傳、HTTP post、SSL連接、cookie、文件傳輸恢復、Metalink等等。
cURL是在命令行中使用的,在軟件開發(fā)過程中,它主要是用來快速測試API的。當我想在Node.js服務器中測試我所有的API時,我個人使用cURL。對于開發(fā)者來說,這是一個非常方便的工具。
Postman很酷,但是cURL非常酷。 – Chidume Nnamdi |
在本文中,我們將介紹基本的cURL函數和選項。我們還將學習如何使用cURL在API端點上執(zhí)行GET,POST請求。
cURL選項
(1) --request 或者 -X
—request 和 -X 指定與HTTP服務器通信時可以使用的自定義請求方法,將使用指定的請求方法代替其他方法(默認為GET)。
要執(zhí)行POST請求:
- curl --request POST
要執(zhí)行GET請求:
- curl --request GET
(2) --url
這指定了我們將獲取或傳輸數據的URL,當你想在配置文件中指定URL時,這個選項非常方便。
如果給定的URL缺少scheme name(例如“http://””或“ftp://””等),則cURL將基于主機進行猜測。
如果最外面的子域名與DICT,FTP,IMAP,LDAP,POP3或SMTP匹配,則將使用該協議。否則,將使用HTTP。
例如,如果你想在本地服務器上的 localhost:3000 上執(zhí)行GET請求,則需要將 --url 設置為 localhost:3000:
- curl --request GET \
- --url http://localhost:3000
要在同一URL上執(zhí)行POST:
- curl --request POST \
- --url http://localhost:3000
注意:反斜杠 \ 用于分隔cURL中的選項。
對于外部API,還是一樣。
假設你要從https://moviesdb.com/movies/all獲取電影列表。
- curl --request GET \
- --url https://moviesdb.com/movies/all
moviedb 中所有電影的列表都將被獲取并打印。
(3) --header 或者 -H
這個選項用于設置請求的頭信息。
當向服務器發(fā)送HTTP時,在請求中包含的額外頭。你可以指定任意數量的額外頭。請注意,如果你要添加一個自定義的頭文件,而這個頭文件的名字與 curl 內部使用的頭文件相同,那么你在外部設置的頭將被用來代替內部頭。
這反映了我們在正常編程中的做法,特別是在JavaScript中使用 XMLHttpRequest:
- const xhttp = new XMLHttpRequest()
- xhttp.setHeader("Content-Type", "application/json")
頭信息用于向Web服務器傳達傳入的數據類型,或期望的數據類型,發(fā)送的數據類型應與標頭中指定的類型相同。
我們可以使用頭文件來獲得CORS權限,甚至可以獲得某些類型的請求方法的權限。我們可以用頭文件做的事情有很多。
因此,在cURL中,我們可以使用 —header 選項設置標頭:
- curl --request POST \
- --url http://localhost:5000/api/user \ --header 'content-type: application/json'
這里,我們正在向http://localhost:5000/api/user 端點發(fā)出 POST 請求,并通過 --header content-type: application/json’ 告訴服務器我們要發(fā)送的數據是 JSON 數據類型。
(4) --data 或者 -d
此選項用于將數據發(fā)送到HTTP服務器,這主要是在POST請求中使用,因為我們將數據發(fā)送到我們要添加到數據庫的服務器。因此,在cURL中,我們可以通過設置 —data 選項將數據指定為POST。
在POST請求中向HTTP服務器發(fā)送指定的數據,就像瀏覽器在用戶填寫HTML表格并按下提交按鈕時一樣。
這是一個例子:
- curl --request POST \
- --url http://localhost:5000 \
- --header 'content-type: application/json' \
- --data '{"name":"Arrow","description":"bad movie","rating":"7.0","image":"michaeljackson.png"}'
在這里,我們正在執(zhí)行對 http://localhost:5000端點的POST請求。
我們在 —data 選項中設置了要發(fā)送到服務器的數據,即:
- '{"name":"Arrow","description":"bad movie","rating":"7.0","image":"michaeljackson.png”}
在Node.js / Express.js中使用cURL
讓我們看看如何設置Node.js / Express.js服務器并使用cURL測試端點:
- // server.js
- const express = require("express")
- const cors = require('cors')
- const bodyParser = require('body-parser')
- const helmet = require('helmet')
- const app = express()let port = 5000 || process.env.PORT
- /** 設置中間件 */app.use(cors())app.use(bodyParser.json({limit: '50mb'}))
- app.use(helmet())let users = []let currId Date.now()app.get("api/user/:id", (req, res, next) => {
- const userId = req.params.id const usersusers = users.filter(user => user.id === userId) if(users.length > 0)
- res.send({ user: users[0] })
- else
- res.send({mesg: "No user found."})
- next()
- })app.get("api/users", (req, res, next) => {
- res.send({ users }) next()
- })app.post("api/user", (req, res, next) => {
- let bdy = req.body bdy = { id: ++currId, ...bdy } users.push(bdy) res.send({ user: bdy }) next()
- })/** 啟動服務器 */app.listen(port, () => { console.log(`Server started at port: ${port}`);
- });
我們在這里有一些小的API端點:
- GEt api/users
- GET api/user/:id
- POST api/user它通過其 id 提取所有用戶(特定用戶),并可以添加新用戶。
啟動服務器:
- node server.js
- Server started at port: 5000
現在,要在 api/user 上執(zhí)行POST請求,我們將 —url 設置為 http://localhost:5000/api/user,并將 --request 設置為POST,將 --header 設置為 content-type:application/json。
我們要添加用戶:
- name: "Chidume",
- age: 28
因此數據將為 '{"name": "Chidume", "age": "28"}'
因此,cURL命令將是:
- curl --request POST \
- --url http://localhost:5000/api/user \
- --header 'content-type: application/json' \
- --data '{"name": "Chidume", "age": "28"}'
- { id: 5122435464, name: "Chidume", age: 28 }
我們從服務器上看到了結果:將用戶及其 id 添加到數據庫中。
讓我們添加另一個用戶:
- curl --request POST \
- --url http://localhost:5000/api/user \
- --header 'content-type: application/json' \
- --data '{"name": "Nnamdi", "age": "21"}'
- { id: 5122435465, name: "Nnamdi", age: 21 }
我們添加了另一個用戶“Nnamdi”,我們可以看到服務器的 id 及其結果。
現在,讓我們通過 api/user/:id 查詢“ Chidume”。在這里 :id 將是 id 5122435464。因此cURL將是:
- curl --request GET \
- --url http://localhost:5000/api/user/5122435464
- { user: { id: 5122435464, name: "Chidume", age: 28 } }
服務器的結果返回 id 為5122435464的用戶,即“Chidume”。
現在讓我們查詢一個不存在的用戶:
- curl --request GET \
- --url http://localhost:5000/api/user/2000000000
- { mesg: "No user found." }
這是當我們遇到不存在的用戶時服務器上返回的結果。
現在,讓我們查詢所有用戶:
- curl --request GET \
- --url http://localhost:5000/api/users
- { users: [ { id: 5122435465, name: "Nnamdi", age: 21 }, { id: 5122435464, name: "Chidume", age: 28 } ] }
如你所見,將返回服務器中的所有用戶。