cURL을 사용하여 JSON 데이터를 어떻게 게시합니까?


2828

우분투를 사용하고 그 위에 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 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 / clear HTTP / 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;
}

6
스프링 3.2.0 게시 요청에 대한 링크 를 확인하십시오 .
AmirHd

답변:


4338

컨텐츠 유형을 application / json으로 설정해야합니다. 그러나 Spring 측에서는 허용되지 않는 -dContent-Type을 보냅니다 application/x-www-form-urlencoded.

curl 맨 페이지를 보면 다음을 사용할 수 있다고 생각합니다 -H.

-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)

참고 -request POST선택 당신이 사용하는 경우 -d는 AS, -d플래그는 POST 요청을 의미한다.


Windows에서는 상황이 약간 다릅니다. 주석 스레드를 참조하십시오.


262
Windows의 경우 json 주위의 작은 따옴표가 작동하지 않아 큰 따옴표를 이탈했습니다. curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method
hiPy

37
Windows에서는 저에게이 형식의 따옴표를 사용하여 따옴표를 이스케이프해야했습니다 "{ """key1""": """value1""" }". 또한이 답변 : stackoverflow.com/questions/18314796/…
chodorowicz

4
@chodorowicz 끔찍하다! VB의 구문 만 알고 있습니다!
Sean Patrick Floyd

3
POST 요청에 문제가 있었지만 대문자로 된 "Application / json"으로 해결되었으므로 415 오류가 발생하면 대문자를 확인하십시오.
WiteCastle

5
@ostrokach 죄송합니다. 시간을 낭비하셨습니다. OSX에서 게시 할 때 구문이 제대로 작동했습니다 (재 시도하지 않았습니다). 플랫폼 차이 일뿐입니다. 나는 upvotes가 그것이 도움이 된 사람들의 것이라고 생각합니다.
Adam Tuttle

564

데이터를 파일에 넣고 말한 body.json다음 사용하십시오.

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

12
--data-binary대신이 옵션을 사용해야합니다 --data. 클라이언트는 그대로 데이터를 전송하지만 --data입력에서 CR 및 LF를 제거합니다.
h2stein

14
인라인 json 문자열과 함께 cUrl을 사용하는 것은 악몽 인 것 같습니다. 큰 따옴표 문자를 피해야 할 필요가 있습니다. 이와 같은 파일을 사용하는 것이 좋습니다.
Xtreme Biker

46
@파일 이름 앞에 문자 를 추가하는 것이 중요 합니다. 그렇지 않으면 작동하지 않습니다. 방금이 쓰레기에서 머리를 두드리는 데 20 분을 보냈습니다 ...
Radu Murzea

3
이 방법으로 파일에서 JSON 린트를 실행하여 JSON 구문 분석에 오류가 있는지 확인할 수 있습니다.
datashaman

4
Windows에서는 파일 이름 "@ body.json"
Stomf

100

당신은 resty 유용 찾을 수 있습니다 : https://github.com/micha/resty

명령 행 REST 요청을 단순화하는 래퍼 라운드 CURL입니다. API 엔드 포인트를 가리키면 PUT 및 POST 명령이 제공됩니다. (홈페이지에서 수정 된 예)

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

또한 콘텐츠 유형 헤더를 추가해야하는 경우가 종종 있습니다. 그러나 사이트 당 메소드 당 구성 파일 추가의 기본값을 설정하기 위해이 작업을 한 번 수행 할 수 있습니다. 기본 RESTY 옵션 설정


93

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

5
참고 - 당신 같은 외모는 JSON 본체 주위에 닫는 따옴표를 놓치고
acanby

3
Windows의 경우, "주변 데이터가 작동하지 않고 따옴표가 작동하지 않습니다.
rodedo

3
PowerShell을 사용하는 경우이 답변을 참조하십시오 .
rsenna

86

그것은 다음을 사용하여 나를 위해 일했습니다 :

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";
}

IdOnlyid 속성을 가진 간단한 POJO 입니다.


56

예를 들어, 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

42

방금 같은 문제가 발생했습니다. 나는 그것을 지정하여 해결할 수 있었다

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

37

이것은 나를 위해 잘 작동했습니다.

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

어디,

-X http 동사를 의미합니다.

--data 보내려는 데이터를 의미합니다.


5
(가) -X POST이 예제에서는 중복
소프트웨어 엔지니어

31

직관적 인 GUI와 함께 Postman 을 사용 하여 cURL명령 을 어셈블 할 수 있습니다 .

  1. Postman 설치 및 시작
  2. URL, 게시물 본문, 요청 헤더 등을 입력하십시오. pp.
  3. 클릭 Code
  4. cURL드롭 다운 목록에서 선택
  5. cURL명령을 복사하여 붙여 넣기

참고 : 드롭 다운 목록에는 자동 요청 생성을위한 몇 가지 옵션이 있으므로 처음에 게시물이 필요하다고 생각한 것입니다.


6
Postman에 기능이 포함되어 있다는 것을 몰랐습니다. 지적 해 주셔서 감사합니다!
ariestav

29

CURL Windows를 사용하여 다음을 시도하십시오.

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

28

우편 배달부를 사용하여 CURL로 변환 할 수 있습니다여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


1
고마워 @ forever-LA 그것은 나를 위해 생명의 은인 팁이었다
vibs2006

24

HTTPie는 에 권장 대안 curl당신은 그냥 할 수 있기 때문에

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

기본적으로 JSON을 사용하며 필요한 헤더를 설정하고 데이터를 유효한 JSON으로 인코딩합니다. 도 있습니다:

Some-Header:value

헤더의 경우

name==value

쿼리 문자열 매개 변수 데이터 청크가 많은 경우 파일을 JSON 인코딩으로 파일에서 읽을 수도 있습니다.

 field=@file.txt

20

RESTful 인터페이스에 대해 많은 JSON 보내기 / 응답을 테스트하는 경우 Chrome 용 Postman 플러그인 (웹 서비스 테스트를 수동으로 정의 할 수 있음) 및 Node.js 기반 Newman 명령을 확인할 수 있습니다. 온라인 동반자 (Postman 테스트의 "컬렉션"에 대한 테스트를 자동화 할 수 있습니다.) 무료 및 공개!


18

이것은 또한 기본 인증을 사용하여 저에게 효과적이었습니다.

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 및 확인 된 인증서가없는 기본 인증을 사용해서는 안됩니다.

오늘 Cygwin의 cURL 7.49.1 for Windows를 사용 하여이 문제에 다시 부딪 쳤습니다. 그리고 JSON 인수를 사용 --data하거나 사용할 때 --data-binarycURL이 혼란스럽고 {}JSON을 URL 템플릿으로 해석합니다 . -gcURL globbing을 끄는 인수를 추가하면 문제 가 해결되었습니다.

괄호와 함께 URL 전달을 참조하십시오 .


17

JSON 컨텐츠를 파일에 넣고 다음 --file-upload과 같이 표준 입력을 통한 옵션을 사용하여 컬에 전달할 수도 있습니다 .

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

16

이것은 나를 위해 일했다 :

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

10

웹 서버로 테스트하기 위해 아래 형식을 사용하고 있습니다.

use -F 'json data'

이 JSON dict 형식을 가정 해 봅시다.

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

전체 예

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

6

페이로드를 추가하려면 -d 옵션을 사용하십시오.

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

게다가:

POST 방법을 사용하려면 -X POST를 사용하십시오.

수락 유형 헤더를 추가하려면 -H 'Accept : application / json'을 사용하십시오.

-H 'Content-Type : application / json'을 사용하여 컨텐츠 유형 헤더를 추가하십시오.


사용하려고했지만 { "errors": [ "no data provided"]} 오류가 발생했습니다.
Suresh

6

이것은 Windows10에서 나를 위해 일했습니다.

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

5

도구를 확인하십시오 . 컬 스 니펫을 쉽게 만들 수 있습니다.

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"

5

동적 데이터가 포함 된 경우이를 수행하는 다른 방법이 있습니다.

#!/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"

1
당신은 내 생명을 구했습니다!
Abhimanyu

4

나는이 질문에 많은 답변을 받았지만 내가 문제가있는 곳을 공유하고 싶었다.

curl -X POST http : // your-server-end-point -H "콘텐츠 유형 : application / json"-d @ path-of-your-json-file.json

참조, 나는 모든 일을 잘했다. 단 하나의 일- "@"JSON 파일 경로 앞에 놓쳤다.

인터넷에서 관련 문서 하나를 찾았습니다-https: //gist.github.com/subfuzion/08c5d85437d5d4f00e58

그것이 소수에게 도움이되기를 바랍니다. 감사


1

SWAGGER를 스프링 부트 애플리케이션으로 구성하고 애플리케이션에서 API를 호출하면 해당 CURL 요청도 볼 수 있습니다.

이것이 CURL을 통해 요청을 생성하는 쉬운 방법이라고 생각합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.