如何使用cURL发布JSON数据?

我使用Ubuntu并在其上安装了cURL。我想用cURL测试我的Spring REST应用程序。我在Java边写了POST代码。但是,我想用cURL测试它。我试图发布一个JSON数据。示例数据如下所示:

{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}

我使用这个命令:

curl -i \-H "Accept: application/json" \-H "X-HTTP-Method-Override: PUT" \-X POST -d "value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true \http://localhost:8080/xx/xxx/xxxx

它返回此错误:

HTTP/1.1 415 Unsupported Media TypeServer: Apache-Coyote/1.1Content-Type: text/html;charset=utf-8Content-Length: 1051Date: Wed, 24 Aug 2011 08:50:17 GMT

错误描述是这样的:

服务器拒绝了此请求,因为请求实体的格式不受所请求方法()的请求资源的支持。

Tomcat日志:"POST/用户界面/webapp/conf/Clear HTTP/1.1"415 1051

cURL命令的正确格式是什么?

这是我的Java代码(我已经测试了GET和DELETE,它们可以工作):

@RequestMapping(method = RequestMethod.PUT)public Configuration updateConfiguration(HttpServletResponse response, @RequestBody Configuration configuration) { //consider @Valid tagconfiguration.setName("PUT worked");//todo If error occurs response.sendError(HttpServletResponse.SC_NOT_FOUND);return configuration;}
3927055 次浏览

您需要将您的Content-type设置为apps/json。但是#0(或--data)发送Content-Typeapplication/x-www-form-urlencoded,Spring方面不接受。

看看curl手册页,我认为你可以使用#0(或--header):

-H "Content-Type: application/json"

完整示例:

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

-H--header的缩写,-d--data的缩写)

请注意,如果您使用-d,则-request POST可选,因为-d标志意味着POST请求。


在Windows上,情况略有不同。请参阅评论线程。

尝试将您的数据放入文件中,例如body.json,然后使用

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

我只是遇到了同样的问题。我可以通过指定来解决它

-H "Content-Type: application/json; charset=UTF-8"

你可能会发现RESTY很有用:

它是一个包装轮CURL,简化了命令行REST请求。你把它指向你的API端点,它会给你PUT和POST命令(从主页改编的示例)。

resty http://127.0.0.1:8080/data #Sets up resty to point at your endpoingGET /blogs.json                  #Gets http://127.0.0.1:8080/data/blogs.json#Put JSONPUT /blogs/2.json '{"id" : 2, "title" : "updated post", "body" : "This is the new."}'# POST JSON from a filePOST /blogs/5.json < /tmp/blog.json

此外,通常仍然需要添加内容类型标头。不过,您可以这样做一次,以设置默认值,即每个站点每个方法添加配置文件:设置默认RESTY选项

它对我有用:

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":100}' http://localhost/api/postJsonReader.do

它被愉快地映射到Spring控制器:

@RequestMapping(value = "/postJsonReader", method = RequestMethod.POST)public @ResponseBody String processPostJsonData(@RequestBody IdOnly idOnly) throws Exception {logger.debug("JsonReaderController hit! Reading JSON data!"+idOnly.getId());return "JSON Received";}

IdOnly是一个简单的POJO,具有id属性。

这对我来说效果很好,另外还使用了BASIC身份验证:

curl -v --proxy '' --basic -u Administrator:password -X POST -H "Content-Type: application/json"--data-binary '{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}'http://httpbin.org/post

当然,您不应该在没有SSL和检查证书的情况下使用BASIC身份验证。

我今天再次遇到这个问题,使用Cygwin的cURL 7.49.1 for Windows……当使用--data--data-binary与JSON参数时,cURL会感到困惑,并将JSON中的{}解释为URL模板。添加-g参数以关闭cURL全局解决了这个问题。

另见将带括号的URL传递给curl

我正在使用以下格式来测试Web服务器。

use -F 'json data'

让我们假设这个JSON字典格式:

{'comment': {'who':'some_one','desc' : 'get it'}}

完整示例

curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'

如果您正在针对RESTful接口测试大量JSON发送/响应,您可能需要查看Chrome的邮递员插件(它允许您手动定义Web服务测试)及其基于Node.js的纽曼命令行伴侣(它允许您针对Postman测试的“集合”自动测试)。

对于Windows,-d值的单引号对我来说不起作用,但在更改为双引号后确实起作用。我还需要在花括号内转义双引号。

也就是说,以下方法不起作用:

curl -i -X POST -H "Content-Type: application/json" -d '{"key":"val"}' http://localhost:8080/appname/path

但以下工作:

curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path

使用CURL Windows,试试这个:

curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee

这对我很有效。

curl -X POST --data @json_out.txt http://localhost:8080/

哪里,

-X表示HTTP动词。

--data表示您要发送的数据。

例如,创建一个JSON文件params.json,并将此内容添加到其中:

[{"environment": "Devel","description": "Machine for test, please do not delete!"}]

然后你运行这个命令:

curl -v -H "Content-Type: application/json" -X POST --data @params.json -u your_username:your_password http://localhost:8000/env/add_server

这对我有效:

curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json

您还可以将JSON内容放入文件中,并通过标准输入使用--upload-file选项将其传递给curl,如下所示:

echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -

您可以使用邮递员及其直观的GUI来组装cURL命令。

  1. 安装并启动邮递员
  2. 输入您的URL、帖子正文、请求标头等pp。
  3. 点击Code
  4. 从下拉列表中选择cURL
  5. 复制和粘贴您的cURL命令

注意:下拉列表中有几个自动生成请求的选项,这就是为什么我认为我的帖子首先是必要的。

HTTPiecurl的推荐替代方案,因为您可以

http POST http://example.com/some/endpoint name=value name1=value1

它默认使用JSON,并将处理为您设置必要的标头以及将数据编码为有效的JSON。还有:

Some-Header:value

对于标题,以及

name==value

用于查询字符串参数。如果您有大量数据,您也可以从文件中读取它,并对其进行JSON编码:

field=@file.txt

使用-d选项添加有效负载

curl -X POST \http://<host>:<port>/<path> \-H 'Accept: application/json' \-H 'Content-Type: application/json' \-d '{"foo": "bar","lorem": "ipsum"}'

此外:

使用-X POST使用POST方法

使用-H'Accept: Application/json'添加接受类型标头

使用-H'Content-Type: apps/json'添加内容类型标头

我为此做了一个名为获取器的工具。它可以发送请求和格式化curl片段:

这里有一个例子:

输入图片描述

输出示例:

curl -XGET -H "Accept: application/json" -d "{\"value\":\"30\",\"type\":\"Tip 3\",\"targetModule\":\"Target 3\",\"configurationGroup\":null,\"name\":\"Configuration Deneme 3\",\"description\":null,\"identity\":\"Configuration Deneme 3\",\"version\":0,\"systemId\":3,\"active\":true}" "http://localhost:8080/xx/xxx/xxxx"

您可以使用邮递员转换为CURL:

在此输入图片描述

在此输入图片描述

备注:

最新的邮递员版本有一些UI升级,现在侧边栏中提供了代码链接。

在此输入图片描述

这在Windows 10上为我工作:

curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X  PUT http://localhost:8080/api/changeowner/CAR4

这是另一种方法,如果您有动态数据要包含。

#!/bin/bash
version=$1text=$2branch=$(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"

我有一个问题:

curl-X POST超文本传输协议://你的服务器端点-H"Content-Type: apps/json"-d@path-of-your-json-file.json

只有一件事-我错过了JSON文件路径前的“@”。

我在Internet上找到了一个相关的首选文档-常用选项

基于Anand Rockzz的回答,这是我在github操作上所做的。由于EOF标签,这有点棘手。

我的目标是在Vercel部署完成后发送HTTP调用(类似于网络钩子)。

这个真实例子可以帮助其他人。

send-webhook-callback-once-deployment-ready:name: Invoke webhook callback url defined by the customer (Ubuntu 18.04)runs-on: ubuntu-18.04needs: await-for-vercel-deploymentsteps:- uses: actions/checkout@v1 # Get last commit pushed - See https://github.com/actions/checkout- name: Expose GitHub slug/short variables # See https://github.com/rlespinasse/github-slug-action#exposed-github-environment-variablesuses: rlespinasse/github-slug-action@v3.x # See https://github.com/rlespinasse/github-slug-action- name: Expose git environment variables and call webhook (if provided)# Workflow overview:#  - Resolves webhook url from customer config file#  - If a webhook url was defined, send arun: |MANUAL_TRIGGER_CUSTOMER="$\{\{ github.event.inputs.customer}}"CUSTOMER_REF_TO_DEPLOY="${MANUAL_TRIGGER_CUSTOMER:-$(cat vercel.json | jq --raw-output '.build.env.NEXT_PUBLIC_CUSTOMER_REF')}"
VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK=$(cat vercel.$CUSTOMER_REF_TO_DEPLOY.staging.json | jq --raw-output '.build.env.VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK')
# Checking if a webhook url is definedif [ -n "$VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK" ]; then# Run script that populates git-related variables as ENV variablesecho "Running script populate-git-env.sh". ./scripts/populate-git-env.sh
echo "Resolved git variables:"echo "'GIT_COMMIT_SHA': $GIT_COMMIT_SHA"echo "'GIT_COMMIT_REF': $GIT_COMMIT_REF"echo "'GIT_COMMIT_TAGS': $GIT_COMMIT_TAGS"
# Generates JSON using a bash function - See https://stackoverflow.com/a/57369772/2391795# "End Of File" must be at the beginning of the line with no space/tab before or after - See https://stackoverflow.com/a/12909284/2391795# But, when executed by GitHub Action, it must be inside the "run" section insteadgenerate_post_data() {cat <<EOF{"MANUAL_TRIGGER_CUSTOMER": "${MANUAL_TRIGGER_CUSTOMER}","CUSTOMER_REF": "${CUSTOMER_REF_TO_DEPLOY}","STAGE": "staging","GIT_COMMIT_SHA": "${GIT_COMMIT_SHA}","GIT_COMMIT_REF": "${GIT_COMMIT_REF}","GIT_COMMIT_TAGS": "${GIT_COMMIT_TAGS}","GITHUB_REF_SLUG": "${GITHUB_REF_SLUG}","GITHUB_HEAD_REF_SLUG": "${GITHUB_HEAD_REF_SLUG}","GITHUB_BASE_REF_SLUG": "${GITHUB_BASE_REF_SLUG}","GITHUB_EVENT_REF_SLUG": "${GITHUB_EVENT_REF_SLUG}","GITHUB_REPOSITORY_SLUG": "${GITHUB_REPOSITORY_SLUG}","GITHUB_REF_SLUG_URL": "${GITHUB_REF_SLUG_URL}","GITHUB_HEAD_REF_SLUG_URL": "${GITHUB_HEAD_REF_SLUG_URL}","GITHUB_BASE_REF_SLUG_URL": "${GITHUB_BASE_REF_SLUG_URL}","GITHUB_EVENT_REF_SLUG_URL": "${GITHUB_EVENT_REF_SLUG_URL}","GITHUB_REPOSITORY_SLUG_URL": "${GITHUB_REPOSITORY_SLUG_URL}","GITHUB_SHA_SHORT": "${GITHUB_SHA_SHORT}"}EOF}
echo "Print generate_post_data():"echo "$(generate_post_data)"
echo "Calling webhook at '$VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK'"echo "Sending HTTP request (curl):"curl POST \"$VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK" \-vs \--header "Accept: application/json" \--header "Content-type: application/json" \--data "$(generate_post_data)" \2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'
# XXX See https://stackoverflow.com/a/54225157/2391795# -vs - add headers (-v) but remove progress bar (-s)# 2>&1 - combine stdout and stderr into single stdout# sed - edit response produced by curl using the commands below#   /^* /d - remove lines starting with '* ' (technical info)#   /bytes data]$/d - remove lines ending with 'bytes data]' (technical info)#   s/> // - remove '> ' prefix#   s/< // - remove '< ' prefix
elseecho "No webhook url defined in 'vercel.$CUSTOMER_REF_TO_DEPLOY.staging.json:.build.env.VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK' (found '$VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK')"fi

对于我使用的PowerShell:

curl.exe -H "Content-Type: application/json" --data "@content.json" http://localhost:8080/appname/path

其中content.json是包含请求的本地JSON文件的名称,curl.exe而不是curl不使用调用WebRequest的别名。

或者如果你想直接指定JSON:

curl.exe -H "Content-Type: application/json" --data '{\"username\":\"xyz\",\"password\":\"xyz\"}' http://localhost:8080/appname/path
  • -H在标头中发送类似Content-type或身份验证令牌的内容
  • -d添加您的数据
  • 最后添加站点链接

注意:不要忘记为身份验证凭据添加身份验证令牌(如果有)

curl -X POST -H 'Content-Type: application/json' -H 'Authorization: Token 2de403987713595a7955a9b4655b9e206d4294b3' -d '{"title":"Post test with curl", "body": "test body"}' http://127.0.0.1:8000/api/v1/feeds/

问题就在这里

HTTP/1.1 415 Unsupported Media Type

服务器登录无法解释此请求的媒体类型,因此它将其解析为text/html

任何资源的媒体类型都在Content-Type中声明请求头的属性

“接受”…标头将使此请求失败,因此发送任何JSON请求都需要以下内容,即内容类型

-H 'content-type: application/json'

假设数据和URL是这样的

{"email":"admin@admin.com","密码":"123456"}

http://localhost:5000/api/login

然后在Linux

curl  http://localhost:5000/api/login  -H 'content-type: application/json'  -d '{"email": "user@admin.com", "password": "123456"}'

在Windows中(参数周围的单引号将不起作用)

curl  http://localhost:5000/api/login  -H "content-type: application/json"  -d "{\"email\": \"user@admin.com\", \"password\": \"123456\"}"

当命令中存在-d{……}时,不需要-X POST键。

对于请求:

-X PUT

太长别读:

使用神圣的三位一体,#0+#1+#2(或#3):

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

这将覆盖缺少的必要标头:不需要显式定义Content-TypeAccept标头。

使用--json的新卷曲方式

2022年3月初,curl发布了一个新的命令行参数--json,版本为7.82.0。这允许通过JSON发送的快捷方式,并消除了定义Content-Type你错过了什么Accept标头的需要,因为这些标头是自动假设的,从而降低了错误的风险:

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

但是等等……还有更多。不要将json参数定义为curl命令行的字符串,而是使用漂亮的#1 CLI工具将JSON定义为一系列键值对,并通过curl管道输出。仅使用jo来定义你的JSON,它的工作方式是这样的:

 > jo -p value=30 type="Tip 3" targetModule="Target 3" configurationGroup=null name="Configuration Deneme 3" description=null identity="Configuration Deneme 3"version=0 systemId=3 active=true{"value": 30,"type": "Tip 3","targetModule": "Target 3","configurationGroup": null,"name": "Configuration Deneme 3","description": null,"identity": "Configuration Deneme 3","version": 0,"systemId": 3,"active": true}

现在让我们用类似的curl命令来展示它,但没有额外的标题,并使用jo+jq来获得漂亮的输出:

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

使用免费API的示例

使用免费(但有限)的API演示:

> jo name=Grogu gender=male email=frog.menace@jedi.edu status=active | \curl --json @- \-H $env:GOREST_TOKEN \-XPATCH "https://gorest.co.in/public/v2/users/1138" | \jq

由于jq,输出格式很好:

{"email": "frog.menace@jedi.edu","name": "Grogu","gender": "male","status": "active","id": 1138}

您可以通过--data-raw参数将JSON文件的内容curl

curl 'https://api.com/route' -H 'Content-Type: application/json' --data-raw "$(cat ~/.json/payload-2022-03-03.json | grep -v '^\s*//')"

注意:JSON文件中的注释通过grep -v '^\s*//'过滤掉

您还可以使用grepcat通过标准输入将数据传递给curl

grep -v '^\s*//' ~/.json/payload-2022-03-03.json | curl 'https://api.com/route' -H 'Content-Type: application/json' -d @-

cat ~/.json/payload-2022-03-03.json | grep -v '^\s*//' | curl 'https://api.com/route' -H 'Content-Type: application/json' -d @-

简单的是

curl -X POST https://localhost:3000/-H "Content-Type: application/json"-d '{"productId": 123456, "quantity": 100}'

--json <data>在POST请求中将指定的JSON数据发送到HTTP服务器。

curl 7.82.0+

# Send a basic JSON objectcurl --json '{"name":"xyz","breed":"xyz","age":100}' http://127.0.0.1:3000/cats
# letter @, read the data from a filecurl --json @cat.txt http://127.0.0.1:3000/cats
# letter -, read the data from stdinecho '{"name":"xyz","breed":"xyz","age":100}' | curl --json @- http://127.0.0.1:3000/cats

卷曲7.82.0-

curl -X POST --header "Content-Type: application/json" --data '{"name":"xyz","breed":"xyz","age":100}' http://127.0.0.1:3000/cats

下面的代码对我有用。

我用的是样本数据接口

curl -X POST --data @json_out.txt https://sampledataapi.com/API/login

解释如下

-X Means the HTTP verb.--data Means the data you want to send.