cURL簡介:高級(jí)程序員都在用的工具
在本教程中,我們介紹cURL的基本選項(xiàng),并通過示例介紹如何使用它們,然后我們開發(fā)了一個(gè)帶有三個(gè)端點(diǎn)的Node/Express服務(wù)器,以演示如何使用本文介紹的cURL選項(xiàng)對(duì)服務(wù)器執(zhí)行cURL的GET/POST請(qǐng)求。
與cURL一起使用的選項(xiàng)很多,我們?cè)诖私榻B的是可用于快速測試API端點(diǎn)的基本選項(xiàng)。
介紹
cURL是一種用于從服務(wù)器傳輸數(shù)據(jù)或向服務(wù)器傳輸數(shù)據(jù)的傳輸工具。它支持各種互聯(lián)網(wǎng)傳輸協(xié)議,包括:
- 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í)行一些有用的技巧,如代理支持、用戶身份驗(yàn)證、FTP上傳、HTTP post、SSL連接、cookie、文件傳輸恢復(fù)、Metalink等等。
cURL是在命令行中使用的,在軟件開發(fā)過程中,它主要是用來快速測試API的。當(dāng)我想在Node.js服務(wù)器中測試我所有的API時(shí),我個(gè)人使用cURL。對(duì)于開發(fā)者來說,這是一個(gè)非常方便的工具。
Postman很酷,但是cURL非常酷。 – Chidume Nnamdi |
在本文中,我們將介紹基本的cURL函數(shù)和選項(xiàng)。我們還將學(xué)習(xí)如何使用cURL在API端點(diǎn)上執(zhí)行GET,POST請(qǐng)求。
cURL選項(xiàng)
(1) --request 或者 -X
—request 和 -X 指定與HTTP服務(wù)器通信時(shí)可以使用的自定義請(qǐng)求方法,將使用指定的請(qǐng)求方法代替其他方法(默認(rèn)為GET)。
要執(zhí)行POST請(qǐng)求:
- curl --request POST
要執(zhí)行GET請(qǐng)求:
- curl --request GET
(2) --url
這指定了我們將獲取或傳輸數(shù)據(jù)的URL,當(dāng)你想在配置文件中指定URL時(shí),這個(gè)選項(xiàng)非常方便。
如果給定的URL缺少scheme name(例如“http://””或“ftp://””等),則cURL將基于主機(jī)進(jìn)行猜測。
如果最外面的子域名與DICT,F(xiàn)TP,IMAP,LDAP,POP3或SMTP匹配,則將使用該協(xié)議。否則,將使用HTTP。
例如,如果你想在本地服務(wù)器上的 localhost:3000 上執(zhí)行GET請(qǐng)求,則需要將 --url 設(shè)置為 localhost:3000:
- curl --request GET \
- --url http://localhost:3000
要在同一URL上執(zhí)行POST:
- curl --request POST \
- --url http://localhost:3000
注意:反斜杠 \ 用于分隔cURL中的選項(xiàng)。
對(duì)于外部API,還是一樣。
假設(shè)你要從https://moviesdb.com/movies/all獲取電影列表。
- curl --request GET \
- --url https://moviesdb.com/movies/all
moviedb 中所有電影的列表都將被獲取并打印。
(3) --header 或者 -H
這個(gè)選項(xiàng)用于設(shè)置請(qǐng)求的頭信息。
當(dāng)向服務(wù)器發(fā)送HTTP時(shí),在請(qǐng)求中包含的額外頭。你可以指定任意數(shù)量的額外頭。請(qǐng)注意,如果你要添加一個(gè)自定義的頭文件,而這個(gè)頭文件的名字與 curl 內(nèi)部使用的頭文件相同,那么你在外部設(shè)置的頭將被用來代替內(nèi)部頭。
這反映了我們?cè)谡>幊讨械淖龇?,特別是在JavaScript中使用 XMLHttpRequest:
- const xhttp = new XMLHttpRequest()
- xhttp.setHeader("Content-Type", "application/json")
頭信息用于向Web服務(wù)器傳達(dá)傳入的數(shù)據(jù)類型,或期望的數(shù)據(jù)類型,發(fā)送的數(shù)據(jù)類型應(yīng)與標(biāo)頭中指定的類型相同。
我們可以使用頭文件來獲得CORS權(quán)限,甚至可以獲得某些類型的請(qǐng)求方法的權(quán)限。我們可以用頭文件做的事情有很多。
因此,在cURL中,我們可以使用 —header 選項(xiàng)設(shè)置標(biāo)頭:
- curl --request POST \
- --url http://localhost:5000/api/user \ --header 'content-type: application/json'
這里,我們正在向http://localhost:5000/api/user 端點(diǎn)發(fā)出 POST 請(qǐng)求,并通過 --header content-type: application/json’ 告訴服務(wù)器我們要發(fā)送的數(shù)據(jù)是 JSON 數(shù)據(jù)類型。
(4) --data 或者 -d
此選項(xiàng)用于將數(shù)據(jù)發(fā)送到HTTP服務(wù)器,這主要是在POST請(qǐng)求中使用,因?yàn)槲覀儗?shù)據(jù)發(fā)送到我們要添加到數(shù)據(jù)庫的服務(wù)器。因此,在cURL中,我們可以通過設(shè)置 —data 選項(xiàng)將數(shù)據(jù)指定為POST。
在POST請(qǐng)求中向HTTP服務(wù)器發(fā)送指定的數(shù)據(jù),就像瀏覽器在用戶填寫HTML表格并按下提交按鈕時(shí)一樣。
這是一個(gè)例子:
- 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í)行對(duì) http://localhost:5000端點(diǎn)的POST請(qǐng)求。
我們?cè)?—data 選項(xiàng)中設(shè)置了要發(fā)送到服務(wù)器的數(shù)據(jù),即:
- '{"name":"Arrow","description":"bad movie","rating":"7.0","image":"michaeljackson.png”}
在Node.js / Express.js中使用cURL
讓我們看看如何設(shè)置Node.js / Express.js服務(wù)器并使用cURL測試端點(diǎn):
- // 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
- /** 設(shè)置中間件 */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()
- })/** 啟動(dòng)服務(wù)器 */app.listen(port, () => { console.log(`Server started at port: ${port}`);
- });
我們?cè)谶@里有一些小的API端點(diǎn):
- GEt api/users
- GET api/user/:id
- POST api/user它通過其 id 提取所有用戶(特定用戶),并可以添加新用戶。
啟動(dòng)服務(wù)器:
- node server.js
- Server started at port: 5000
現(xiàn)在,要在 api/user 上執(zhí)行POST請(qǐng)求,我們將 —url 設(shè)置為 http://localhost:5000/api/user,并將 --request 設(shè)置為POST,將 --header 設(shè)置為 content-type:application/json。
我們要添加用戶:
- name: "Chidume",
- age: 28
因此數(shù)據(jù)將為 '{"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 }
我們從服務(wù)器上看到了結(jié)果:將用戶及其 id 添加到數(shù)據(jù)庫中。
讓我們添加另一個(gè)用戶:
- 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 }
我們添加了另一個(gè)用戶“Nnamdi”,我們可以看到服務(wù)器的 id 及其結(jié)果。
現(xiàn)在,讓我們通過 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 } }
服務(wù)器的結(jié)果返回 id 為5122435464的用戶,即“Chidume”。
現(xiàn)在讓我們查詢一個(gè)不存在的用戶:
- curl --request GET \
- --url http://localhost:5000/api/user/2000000000
- { mesg: "No user found." }
這是當(dāng)我們遇到不存在的用戶時(shí)服務(wù)器上返回的結(jié)果。
現(xiàn)在,讓我們查詢所有用戶:
- curl --request GET \
- --url http://localhost:5000/api/users
- { users: [ { id: 5122435465, name: "Nnamdi", age: 21 }, { id: 5122435464, name: "Chidume", age: 28 } ] }
如你所見,將返回服務(wù)器中的所有用戶。