使用cURL POST JSON数据的方法

使用cURL POST JSON数据的方法

技术背景

在开发和测试RESTful API时,经常需要向服务器发送JSON数据。cURL是一个强大的命令行工具,可用于与服务器进行各种HTTP请求交互。当我们需要使用cURL发送JSON数据时,可能会遇到一些问题,比如服务器返回415 Unsupported Media Type错误,这通常是由于请求头或数据格式设置不正确导致的。

实现步骤

1. 设置请求头

在发送JSON数据时,需要设置Content-Type请求头为application/json,这样服务器才能正确识别请求的数据类型。可以使用-H--header选项来设置请求头。

2. 选择数据传递方式

可以直接在命令中指定JSON数据,也可以将JSON数据存储在文件中,然后通过文件传递数据。

3. 发送请求

使用-X选项指定请求方法为POST,并指定服务器的URL。

核心代码

直接在命令中指定JSON数据

1
2
3
4
curl --header "Content-Type: application/json" \
--request POST \
--data '{"username":"xyz","password":"xyz"}' \
http://localhost:3000/api/login

将JSON数据存储在文件中

假设JSON数据存储在body.json文件中:

1
curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf

Windows系统下的注意事项

在Windows系统下,单引号可能不适用,需要使用双引号并对JSON数据中的双引号进行转义:

1
curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method

新版cURL的--json选项

从cURL 7.82.0版本开始,支持--json选项,可简化JSON数据的发送:

1
curl --json '{"tool": "curl"}' https://example.com/

也可以结合jo工具使用:

1
2
3
4
5
jo value=30 type="Tip 3" targetModule="Target 3" configurationGroup=null name="Configuration Deneme 3" description=null identity="Configuration Deneme 3" | \
curl --json @- \
-X POST \
http://localhost:8080/xx/xxx/xxxx | \
jq

最佳实践

使用工具生成cURL命令

可以使用Postman等工具,通过其直观的GUI界面组装请求,然后生成cURL命令。具体步骤如下:

  1. 安装并启动Postman。
  2. 输入URL、请求体、请求头等信息。
  3. 点击“Code”按钮,从下拉列表中选择cURL。
  4. 复制并粘贴生成的cURL命令。

编写脚本处理动态数据

如果需要处理动态数据,可以编写脚本生成JSON数据,然后使用cURL发送请求。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash

version=$1
text=$2
branch=$(git rev-parse --abbrev-ref HEAD)
repo_full_name=$(git config --get remote.origin.url | sed 's/.*:\/\/github.com\///;s/.git$//')
token=$(git config --global github.token)

generate_post_data()
{
cat <<EOF
{
"tag_name": "$version",
"target_commitish": "$branch",
"name": "$version",
"body": "$text",
"draft": false,
"prerelease": false
}
EOF
}

echo "Create release $version for repo: $repo_full_name branch: $branch"
curl --data "$(generate_post_data)" "https://api.github.com/repos/$repo_full_name/releases?access_token=$token"

常见问题

415 Unsupported Media Type错误

这个错误通常是由于没有正确设置Content-Type请求头导致的。确保在请求中添加-H "Content-Type: application/json"

引号问题

在不同的操作系统和终端环境中,引号的使用可能会有所不同。在Windows系统下,单引号可能不适用,需要使用双引号并对JSON数据中的双引号进行转义。

cURL版本问题

旧版本的cURL可能不支持--json选项。如果需要使用该选项,需要将cURL升级到7.82.0或更高版本。