爱学习的好孩子

curl

时间: 2024-06-09

一、安装

Curl 官网

二、基础知识

命令格式

curl [options...] <url>

常用选项

short long params comment
-A --user-agent <name> Send User-Agent <name> to server
-d --data <data> HTTP POST data
-D <file> Write Header info to file
-f --fail Fail fast with no output on HTTP errors
-h --help <category> Get help for commands
-i --include Include protocol response headers in the output
-o --output <file> Write to file instead of stdout
-O --remote-name Write output to a file named as the remote file
-s --silent Silent mode
-T --upload-file <file> Transfer local FILE to destination
-u --user user:password Server user and password
-v --verbose Make the operation more talkative
-V --version Show version number and quit

实例

POST请求

在发送POST请求时,对于JSON字符串,要记得用反斜杠!比如:

curl -X POST -d "{\"name\":\"tom\"}" http://cloud.bmob.cn/72e3342dbed48706/test

实测发现根本不能用-d '{\"name\":\"tom\"}'这种办法来简化!

下载文件

curl -o a.txt http://a.com/a.txt

常见问题

1. 在PowerShell中使用出现异常?

当我在ps(powershell)中调用curl并输入参数时,始终提示不对,What?

于是使用get-help查询,结果如下:

PS C:\Users\sx00x> Get-Help curl

名称
    Invoke-WebRequest

语法
    Invoke-WebRequest [-Uri] <uri>  [<CommonParameters>]

别名
    iwr
    wget
    curl

原来,curlps原生命令Invoke-WebRequest的别名。

想要调用curl,应在ps中输入:curl.exe及参数,问题解决。

PS C:\Users\sx00x> curl.exe -X POST --data-urlencode a=b --data-urlencode c=d http://localhost:8080

2. 不支持compressed

windows10用户可能会遇到如下错误:

curl: option --compressed: the installed libcurl version doesn't support this

解决方法:将curlbin目录路径添加到系统环境变量Path中,注意,必须将环境变量上移至第一个

进阶

import {
  Application,
  helpers,
  Router,
} from "https://deno.land/x/oak@v10.4.0/mod.ts";

const app = new Application();
const router = new Router();

router
  .get("/", (ctx) => {
    ctx.response.body = "Home Page.";
  })
  // 测试URL: http://localhost/book?name=abc&id=123
  .get("/book", (ctx) => {
    let params = helpers.getQuery(ctx, { mergeParams: true });
    console.log(params);
    ctx.response.body = "name=" + params.name + "  id=" + params.id;
  })
  // 测试URL: http://localhost/book/abc
  .get("/book/:name", (ctx) => {
    let params = helpers.getQuery(ctx, { mergeParams: true });
    console.log(params);
    ctx.response.body = "name = " + params.name;
  })
  // 测试: curl -X POST -d 'hello world' http://localhost/text
  // 测试: curl -X POST -d '{"name":"abc","id":123}' http://localhost/text
  // 同样的json数据,不同的方式解析出来结果是不一样的。一个是字符串,一个是json对象
  .post("/text", async (ctx) => {
    const { request } = ctx;
    const res = request.body({ type: "text" });
    const text = await res.value;
    console.log(text);
    ctx.response.body = text;
  })
  // 测试: curl -X POST -d '{"name":"abc","id":123}' http://localhost/json
  // 测试: curl -X POST -d 'hello world' http://localhost/json # 会出错!!!
  .post("/json", async (ctx) => {
    const { request } = ctx;
    const res = request.body({ type: "json" });
    const json = await res.value;
    console.log(json, json.name, json.id);
    ctx.response.body = json;
  })
  // 测试: curl -X POST -d @data.json http://localhost/jsonFile  # 如果字段较多,可以直接提交json文件
  .post("/jsonFile", async (ctx) => {
    const { request } = ctx;
    const res = request.body({ type: "json" });
    const jsonFile = await res.value;
    console.log(jsonFile);
    ctx.response.body = jsonFile;
  });

app.use(router.routes());
app.use(router.allowedMethods());

console.log("Server listen on port 80.");
await app.listen({ port: 80 });

评论