我使用Ubuntu并在上面安装了cURL。我想用cURL测试我的SpringREST应用程序。我在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 Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1051
Date: Wed, 24 Aug 2011 08:50:17 GMT

错误描述如下:

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

Tomcat日志:“POST/ui/webapp/conf/clearHTTP/1.1”415 1051

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

这是我的Java端PUT代码(我测试过GET和DELETE,它们都有效):

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

当前回答

我为此制作了一个叫做“提取器”的工具。它可以发送请求并格式化卷曲片段:

下面是一个示例:

示例输出:

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"

其他回答

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

卷曲7.82.0+

# Send a basic JSON object
curl --json '{"name":"xyz","breed":"xyz","age":100}' http://127.0.0.1:3000/cats

# letter @, read the data from a file
curl --json @cat.txt http://127.0.0.1:3000/cats

# letter -, read the data from stdin
echo '{"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

https://curl.se/docs/manpage.html#--json文件

使用CURL Windows,尝试以下操作:

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

根据Anand Rockzz的回答,以下是我在GitHub Actions上对此所做的操作。由于EOF标签,这有点棘手。

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

这个真实世界的例子可能会帮助其他人。

send-webhook-callback-once-deployment-ready:
  name: Invoke webhook callback url defined by the customer (Ubuntu 18.04)
  runs-on: ubuntu-18.04
  needs: await-for-vercel-deployment
  steps:
    - 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-variables
      uses: 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 a
      run: |
        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 defined
        if [ -n "$VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK" ]; then
          # Run script that populates git-related variables as ENV variables
          echo "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 instead
          generate_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

        else
          echo "No webhook url defined in 'vercel.$CUSTOMER_REF_TO_DEPLOY.staging.json:.build.env.VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK' (found '$VERCEL_DEPLOYMENT_COMPLETED_WEBHOOK')"
        fi

它对我有用,使用:

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是一个具有id属性的简单POJO。

您可以通过--dataraw参数将JSON文件的内容分类为curl。

卷曲'https://api.com/route'-H'内容类型:application/json'--数据原始“$(cat~/.json/payload-2022-03-03.json|grep-v'^\s*//')”

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

您还可以使用grep或cat通过标准输入将数据传递给curl。

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

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