|
* }. p$ m3 H) T2 \! g; z 在本教程中,我们介绍cURL的基本选项,并通过示例介绍如何使用它们,然后我们开发了一个带有三个端点的Node/Express服务器,以演示如何使用本文介绍的cURL选项对服务器执行cURL的GET/POST请求。
# t! F8 Y: U. H1 B+ M0 V; ` 与cURL一起使用的选项很多,我们在此介绍的是可用于快速测试API端点的基本选项介绍cURL是一种用于从服务器传输数据或向服务器传输数据的传输工具它支持各种互联网传输协议,包括:DICTFILEFTP, FTPS。 6 d3 C w) ~0 a' T$ K# C- f
GOPHERHTTP, HTTPSIMAP, IMAPSLDAP, LDAPSPOP3, POP3SRTMP, RTSPSCP, SFTPSMB, SMBSSMTP, SMTPSTELNET and TFTP
5 j$ T; T2 ?, k1 p 我们可以使用cURL执行一些有用的技巧,如代理支持、用户身份验证、FTP上传、HTTP post、SSL连接、cookie、文件传输恢复、Metalink等等cURL是在命令行中使用的,在软件开发过程中,它主要是用来快速测试API的。
$ i: b( n/ ~5 N' u4 R" _ 当我想在Node.js服务器中测试我所有的API时,我个人使用cURL对于开发者来说,这是一个非常方便的工具 Postman很酷,但是cURL非常酷 – Chidume Nnamdi在本文中,我们将介绍基本的cURL函数和选项。
5 @8 t; D: r5 ]1 |$ \. B 我们还将学习如何使用cURL在API端点上执行GET,POST请求cURL选项--request 或者 -X—request 和 -X 指定与HTTP服务器通信时可以使用的自定义请求方法,将使用指定的请求方法代替其他方法(默认为GET)。 . a9 l4 f6 c9 d5 ]
要执行POST请求:curl --request POST要执行GET请求:curl --request GET--url 0 a# R( Z6 ]8 c2 i
如果给定的URL缺少scheme name(例如“http://””或“ftp://””等),则cURL将基于主机进行猜测如果最外面的子域名与DICT,FTP,IMAP,LDAP,POP3或SMTP匹配,则将使用该协议。
& Q+ [* F& o/ F 否则,将使用HTTP例如,如果你想在本地服务器上的 localhost:3000 上执行GET请求,则需要将 --url 设置为 localhost:3000:curl --request GET \
8 H: w; b- i' U7 F3 s) L+ T --url http://localhost:3000 6 @# |& j0 q' p" u$ @, f( K
要在同一URL上执行POST:curl --request POST \4 ?% U+ Y& T# c' N% U- f5 O3 h2 y
--url http://localhost:3000注意:反斜杠 \ 用于分隔cURL中的选项对于外部API,还是一样。 # A) N5 \: U8 x0 M$ H$ o0 V
假设你要从https://moviesdb.com/movies/all获取电影列表curl --request GET \. V* j% m8 s! X" c2 ? A
--url https://moviesdb.com/movies/all。
9 e0 `! h$ X- ? r moviedb 中所有电影的列表都将被获取并打印--header 或者 -H这个选项用于设置请求的头信息当向服务器发送HTTP时,在请求中包含的额外头你可以指定任意数量的额外头请注意,如果你要添加一个自定义的头文件,而这个头文件的名字与 curl 内部使用的头文件相同,那么你在外部设置的头将被用来代替内部头。 1 K& n" A5 J) j2 E, q; ~5 {
这反映了我们在正常编程中的做法,特别是在JavaScript中使用 XMLHttpRequest:const xhttp = new XMLHttpRequest(), d3 M, ]7 h- X6 X' s5 ]
" k$ K7 `" W6 b, u* u' f& K xhttp.setHeader("Content-Type", "application/json") + ~3 Z/ d* g) f/ \. s- h" S
头信息用于向Web服务器传达传入的数据类型,或期望的数据类型,发送的数据类型应与标头中指定的类型相同我们可以使用头文件来获得CORS权限,甚至可以获得某些类型的请求方法的权限我们可以用头文件做的事情有很多。
/ I4 g+ l' R# [6 `% J 因此,在cURL中,我们可以使用 —header 选项设置标头:curl --request POST \2 m* a5 k6 G' o9 w8 d
--url http://localhost:5000/api/user \% }) {1 ?# q& Q! Z* _ _( O" O
--header content-type: application/json
6 y' \0 ^0 K5 b- y) m% R) Y 这里,我们正在向http://localhost:5000/api/user 端点发出 POST 请求,并通过 --header content-type: application/json’ 告诉服务器我们要发送的数据是 JSON 数据类型。 + {; L( g6 F9 j- f7 h8 ~, u
--data 或者 -d此选项用于将数据发送到HTTP服务器,这主要是在POST请求中使用,因为我们将数据发送到我们要添加到数据库的服务器因此,在cURL中,我们可以通过设置 —data 选项将数据指定为POST。 - S4 ^# P4 Q% q0 c
在POST请求中向HTTP服务器发送指定的数据,就像浏览器在用户填写HTML表格并按下提交按钮时一样这是一个例子:curl --request POST \! T' N5 K u' k* J
--url http://localhost:5000 \
C# L- l+ j1 o' X N --header content-type: application/json \5 S. p/ j; [# f) b6 l H
--data {"name":"Arrow","description":"bad movie","rating":"7.0","image":"michaeljackson.png"}。
! |9 V j, o8 J5 [ 在这里,我们正在执行对 http://localhost:5000端点的POST请求我们在 —data 选项中设置了要发送到服务器的数据,即:{"name":"Arrow","description":"bad movie","rating":"7.0","image":"michaeljackson.png”}。
4 C9 H* H# J1 V/ W4 Y' g5 L/ @ 在Node.js / Express.js中使用cURL让我们看看如何设置Node.js / Express.js服务器并使用cURL测试端点:// server.js
; S' ^5 u: g1 k' v# ]; w9 C constexpress=require / P5 c; a3 d2 f$ I# T) _
("express")constcors=require(cors)constbodyParser=require(body-parser)consthelmet=require(helmet)const ; q3 m+ A0 C5 U g4 l
app=express()letport=5000||process.env.PORT/** 设置中间件 */app.use(cors())app.use(bodyParser.json({limit: 4 S# l1 u {5 ]4 R2 O9 \& u% Q( }
50mb}))app.use(helmet())letusers=[]letcurrIdDate.now()app.get("api/user/:id",(req,res,next)=>{constuserId + d6 n) c; R8 Z. G/ q# Y$ \; ~
=req.params.idconstusers=users.filter(user=>user.id===userId)if(users.length>0)res.send({user:users[0 ' u8 B: u {1 ?( I4 q
]})elseres.send({mesg:"No user found."})next()})app.get("api/users",(req,res,next)=>{res.send({users}) . x( N( v3 K o8 _
next()})app.post("api/user",(req,res,next)=>{letbdy=req.bodybdy={id:++currId,...bdy}users.push(bdy)res & {/ B5 w/ H1 T+ j$ y- L0 v
.send({user:bdy})next()})/** 启动服务器 */app.listen(port,()=>{console.log(`Server started at port: ${port 3 i# q. {# `# p c4 @$ n
}`);});我们在这里有一些小的API端点:GEt api/usersGET api/user/:idPOST api/user它通过其 id 提取所有用户(特定用户),并可以添加新用户启动服务器:node server.js
0 P! K7 [3 v7 F+ w; ?* X/ O: ]
$ u) V# U( J- `/ @6 h Server started at port: 5000 ( I, t/ f; }$ {9 u0 G2 T& c
现在,要在 api/user 上执行POST请求,我们将 —url 设置为 http://localhost:5000/api/user,并将 --request 设置为POST,将 --header 设置为 - _- l- j+ g2 F8 N$ P# Z, H
content-type:application/json我们要添加用户:name: "Chidume",+ ?1 i5 b% A: ?) y2 f' P
age: 28因此数据将为 {"name": "Chidume", "age": "28"}因此,cURL命令将是:
: P. K$ w; O5 I! X7 D curl --request POST \& L) _8 V# i* z; u% C1 p$ v2 {2 i
--url http://localhost:5000/api/user \- F7 V4 K- c i& d% S! g. T: d0 R
--header content-type: application/json \
: s# ~3 s' r- T. c' r --data {"name": "Chidume", "age": "28"}, m* D! i7 V5 t2 M& `$ q( P
+ [' S" C7 j& L1 q1 t+ d* T { id: 5122435464, name: "Chidume", age: 28 }
2 `' [/ Z6 T7 a 我们从服务器上看到了结果:将用户及其 id 添加到数据库中让我们添加另一个用户:curl --request POST \* X( K }: E) a
--url http://localhost:5000/api/user \
; C. I7 ~; Y0 h* v+ x% I# n --header content-type: application/json \
& f# l5 k* W" T3 p --data {"name": "Nnamdi", "age": "21"}# ^, q. L+ W: Q! y
1 T- }( O1 w) O( r { id: 5122435465, name: "Nnamdi", age: 21 }。 % R( Q8 t+ {3 d: I
我们添加了另一个用户“Nnamdi”,我们可以看到服务器的 id 及其结果现在,让我们通过 api/user/:id 查询“ Chidume”在这里 :id 将是 id 5122435464因此cURL将是:。 * X5 W+ f) E! z* `: Z
curl --request GET \
. _' V- _4 ?1 S: e8 `6 v$ O" @ --url http://localhost:5000/api/user/5122435464
- Q0 e- H; y$ L) [) _6 b4 }" g
8 D' B. \- m: D+ ~: K- c2 [5 ~' h { user: { id: 5122435464, name: "Chidume", age: 28 } } - P4 r. n. s: U$ Z7 T
服务器的结果返回 id 为5122435464的用户,即“Chidume”现在让我们查询一个不存在的用户:curl --request GET \9 _9 T. n1 o+ y) T h+ t
--url http://localhost:5000/api/user/2000000000- o9 u: [+ [$ R+ s" \& o
) X/ U ?" R7 H) m
5 e6 u$ {6 b+ S" w* q; f { mesg: "No user found." }。
( m* \# t! k( o 这是当我们遇到不存在的用户时服务器上返回的结果现在,让我们查询所有用户:curl --request GET \' G7 c, T: Y1 w2 k( l
--url http://localhost:5000/api/users9 R5 P/ F. v: M2 k7 f. \
! @+ Z2 \) E( E' {
9 n4 _8 }6 f, {9 B { users: [ { id: 5122435465, name: "Nnamdi", age: 21 }, { id: 5122435464, name: "Chidume", age: 28 } ] }。
4 Y% r- j# M5 v 如你所见,将返回服务器中的所有用户结束如果你对此有任何疑问,或者我应该添加,更正或删除任何内容,请随时发表评论原文:https://blog.logrocket.com作者:Chidume Nnamdi Follow。 % n2 y3 ^1 n9 U5 D$ h
$ L8 d7 R- y5 \% |) p$ K0 s5 h! Y
9 @% Z' D+ Q/ ?7 _+ N# e* l
3 g* ^) n0 C' n) n# { |