3

必须推荐给基友的Curl工具使用指南

 1 year ago
source link: http://www.androidchina.net/12629.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Curl工具使用指南

Curl工具使用指南

curl是一个命令行工具,用于发送客户端请求。发送客户端请求大家常用的可能是类似postman等工具,但是为什么要使用curl呢?curl等最大优势在于随时随手可以发送,非常方便。比如很多场景下我们只是想快速验证一个请求或接口:

# 直接在命令行发送一个GET请求
curl https://xxx.com/api/v1/xxx

# 发送POST请求
curl -X POST -d "k1=123&k2=456" https://xxx.com/api/v1/xxx
8355a07a79124670a0b2f692116c024b~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?

curl安装

curl的安装就是到官网根据你的系统下载对应的版本进行安装,但是安装好后要配置环境变量。

官网: https://curl.se/download.html

# 安装好后重启终端运行,查看版本
curl -V

如果能看到如下内容则是安装成功了:

13236500e82a4c57a3b552c063a38bf6~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?

发送GET请求

  • curl后面直接添加url地址即可访问GET请求
curl https://www.baidu.com

请求百度网址的效果如下:

0bcef6d8ea87429b96e21914dc3e5499~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?
  • 发送GET请求携带请求参数
curl https://www.xxx.com/?key=value1&key2=value2

POST请求

-X POST --data "k1=v1&k2=v2"发送post请求,并且携带请求数据。下面演示一个接收POST请求并返回POST数据的的Node服务和CURL发送POST请求示例:

/**
 * http服务,处理post请求并将post数据返回
 */
const http = require('http');

const server = http.createServer((req, res) => {
  if (req.method === 'POST' && hasbody(req)) {
    const buffer = [];
    req.on('data', (chunk) => {
      buffer.push(chunk);
    });
    req.on('end', () => {
      const rawBody = Buffer.concat(buffer).toString();
      res.writeHead(200);
      res.end(rawBody);
    });
  } else {
    res.end('');
  }
});

server.listen(3000, () => {
  console.log('server running at port 3000.');
});

// 判断是否有body请求实体数据
function hasbody (req) {
  return req.headers['transfer-encoding'] !== undefined ||
    !isNaN(req.headers['content-length']);
}

curl发送post请求:

curl -X POST --data "key1=123&key2=456" http://localhost:3000

# --data可以简写为-d
curl -X POST -d "key1=123&key2=456" http://localhost:3000
68fd54c3d9244b7ea3406358d8b1be36~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?
  • post数据进行url编码
# 注意,--data-urlencode的简写不是-d
# --data的简写是-d
curl --data-urlencode "k1=1&k2=a b"  http://localhost:3000

例如下面发送对请求数据中,ab之间有个空格,使用--data-urlencode会对其进行encodeURIComponent编码:

c9e7927e36aa4c9ba935bfebcd557b5e~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?

发送HEAD请求

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200);
  res.end();
});

server.listen(3000, () => {
  console.log('server running at port 3000.');
});

-I 参数可以发送HEAD请求:

curl -I http://localhost:3000
73f71473d55049b6a37e13218a0946fc~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?

发送DELETE请求

-X DELETE参数可以发送DELETE请求:

curl -X DELETE http://localhost:3000
960cf075937b4cf88c3ff41fff15912c~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?

发送PUT请求

下面起一个非常简易的node服务,将用户上传的图片保存成图片:

const http = require('http');
const fs = require('fs');

const server = http.createServer((req, res) => {
  // 如果是PUT请求且访问的接口是/upload/file
  if (req.method === 'PUT' && req.url === '/upload/file') {
    // 将用户的数据存成图片static/mime.png图片
    const writeStream = fs.createWriteStream(__dirname + '/static/mime.png');
    req.pipe(writeStream).on('finish', () => {
      res.writeHead(200);
      res.end('upload success');
    });
    writeStream.on('error', (err) => {
      res.writeHead(500);
      res.end('server error.');
    });
  }
});

server.listen(3000, () => {
  console.log('server running at port 3000.');
});

利用curl-T可以发送PUT类型请求,同时需要指定上传的资源路径:

curl -T ./mime.png http://localhost:3000/upload/file
9c6ef18d9b344a01ab9333ae7971efa8~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?

同时请求结束后,可以看到上传的图片已经被保存下来了:

6ae24f4556cf49b888d9124618c55e7a~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?

curl下载文件

下载保存文件是加-o 保存地址参数。

# 将baidu的html文件下载到本地
curl -o ./my-download.html https://www.baidu.com

curl命令执行的效果如下图,而且文件也已经被下载了下来:

d90e4cd384234ad9b233168c83d38bb4~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?

查看响应头参数

-i参数可以返回响应头信息

curl -i  https://www.baidu.com
2cc65c61860149e193665ea22ea5fd67~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?

查看完整的报文信息

  • -v参数查看完整的报文信息
curl -v https://www.baidu.com
d8d7e71a8d254d0689f7cc28174fd088~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?
  • --trace ./log.txt查看更详细的信息并将数据写入到指定文件中。
curl --trace ./log.txt https://www.baidu.com
e95c1652e26b43b19966f44fd77ce555~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?
  • --trace-ascii ./log.txt以ascii编码格式查看更详细的信息并将数据写入到指定文件中。

指定请求的user-agent

我们启动一个最简单的http服务,并且配置好vscodedebug用于我们查看curl发送的信息:

const http = require('http');

const server = http.createServer((req, res) => {
  // 在此处打上断点,查看req请求对象
  res.end('');
});

server.listen(3000, () => {
  console.log('server running at port 3000.');
});

如果直接通过curl发送GET请求,可以看到user-agent为:

9f215b16987547c9abfa9c59a58310b1~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?
chrome`浏览器的`user-agent`是`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.109 Safari/537.36

--user-agent "xxx"可以指定发送请求时的user-agent,参数简写为-A:

curl --user-agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.109 Safari/537.36" http://localhost:3000

# --user-agent简写为-A
curl -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.109 Safari/537.36" http://localhost:3000
ca0ba32d71614fb6a7e8af242aa899be~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?

指定请求的跳转

--referer 跳转前url 跳转后url
curl --referer http://localhost:3000 http://localhost:3000/newpath

此时发送的请求的req.url是新的地址http://localhost:3000/newpath,并且headers中携带了referer字段。

6e6d48eac7024827a87e43be5927bc0a~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?

请求时携带cookie参数

  • --cookie "k1=v1&k2=v2"携带cookie参数,--cookie可以简写为-b:
curl --cookie "k=1&k2=2" http://localhost:3000

# --cookie简写为-b
curl -b "k=1&k2=2" http://localhost:3000
7b60fdd3a99f492487a282d9c71605df~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?
  • curl保存服务端的cookie到指定文件

为了使用curl时能携带服务端设置的cookie,我们可以先把服务的cookie存到本地,然后后续使用curl的适合再携带上。如下,有一个node设置cookie的例子:

const http = require('http');

const server = http.createServer((req, res) => {
  // Node设置cookie
  res.writeHead(200, {
    'Set-Cookie': 'key1=value1&key2=value2',
  });
  res.end('cookie set success.');
});

server.listen(3000, () => {
  console.log('server running at port 3000.');
});

通过curl发送请求携带-c path/to/save,可以将node设置的cookie保存到本地:

curl -c ./cookie http://localhost:3000
160921457b7b4305850e3a0cb5a12dd5~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?
  • curl发送请求时携带cookie文件
curl -b ./cookie http://localhost:3000

此时debug可以看到req上已经携带了我们的cookie:

51f3cf54845140c19a841b52c7d9fd2a~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?
  • curl文档 :https://catonmat.net/cookbooks/curl
  • curl网站开发指南 阮一峰 :https://www.ruanyifeng.com/blog/2011/09/curl.html
  • curl 的用法指南 阮一峰 :https://www.ruanyifeng.com/blog/2019/09/curl-reference.html

curl对于想随手快速验证一个服务是非常便利的,而且真是越用越好用。希望小伙伴看完这篇教程之后能够使用起来,帮助到大家平日的开发工作。

ftd2

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK