질문자 :kamaci
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 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; }
콘텐츠 유형을 application/json으로 설정해야 합니다. 그러나 -d
(또는 --data
)는 Spring 측에서 허용되지 않는 Content-Type application/x-www-form-urlencoded
curl 매뉴얼 페이지를 보면 -H
(또는 --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
)
참고 것을 -request POST
당신이 사용하는 경우 선택 사항입니다 -d
는 AS, -d
플래그는 POST 요청을 의미한다.
Windows에서는 상황이 약간 다릅니다. 댓글 스레드를 참조하세요.
Sean Patrick Floydbody.json
과 같은 파일에 데이터를 넣은 다음 사용하십시오.
curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
Typisch-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
venkatnzresty가 유용할 수 있습니다: 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
또한 여전히 Content Type 헤더를 추가해야 하는 경우가 많습니다. 하지만 이 작업을 한 번만 수행하여 기본값을 설정할 수 있습니다(사이트별 메서드당 구성 파일 추가: 기본 RESTY 옵션 설정)
mo-seph다음을 사용하여 저에게 효과적이었습니다.
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입니다.
Luis예를 들어 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
Eduardo Cerqueira우편 배달부를 사용하여 CURL로 변환할 수 있습니다.
byte mamba나는 단지 같은 문제가 발생합니다. 지정하여 해결할 수 있습니다.
-H "Content-Type: application/json; charset=UTF-8"
Steffen Roller이것은 나를 위해 잘 작동했습니다.
curl -X POST --data @json_out.txt http://localhost:8080/
어디에,
-X
http 동사를 의미합니다.
--data
보내려는 데이터를 의미합니다.
Felipe Pereira직관적인 GUI와 함께 Postman 을 사용 cURL
명령을 조합할 수 있습니다.
- Postman 설치 및 시작
- URL, 게시물 본문, 요청 헤더 등을 입력하십시오. pp.
-
Code
클릭하십시오 - 드롭다운 목록에서
cURL
선택 -
cURL
명령 복사 및 붙여넣기
참고: 드롭다운 목록에는 자동화된 요청 생성을 위한 몇 가지 옵션이 있습니다. 그래서 저는 처음에 제 게시물이 필요하다고 생각했습니다.
kiltekCURL Windows를 사용하여 다음을 시도하십시오.
curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee
Márcio BrenerHTTPie 는 다음을 수행할 수 있기 때문에 curl
의 권장 대안입니다.
$ http POST http://example.com/some/endpoint name=value name1=value1
기본적으로 JSON을 사용하며 필요한 헤더를 설정하고 데이터를 유효한 JSON으로 인코딩하는 작업을 모두 처리합니다. 도 있습니다:
Some-Header:value
헤더의 경우
name==value
쿼리 문자열 매개변수의 경우. 데이터 청크가 큰 경우 JSON으로 인코딩된 파일에서 읽을 수도 있습니다.
field=@file.txt
toshRESTful 인터페이스에 대해 많은 JSON 보내기/응답을 테스트하는 경우 Chrome용 Postman 플러그인(웹 서비스 테스트를 수동으로 정의할 수 있음)과 Node.js 기반 Newman 명령을 확인하는 것이 좋습니다. -line 동반자(Postman 테스트의 "컬렉션"에 대한 테스트를 자동화할 수 있습니다.) 모두 무료이며 개방적입니다!
ftexperts이것은 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
를 사용할 때, cURL은 혼란스러워서 {}
를 URL로 해석할 것입니다 주형. -g
인수를 추가하여 cURL 글로빙을 끄면 해결되었습니다.
curl에 대괄호가 있는 URL 전달 도 참조하세요.
davenpcjJSON 콘텐츠를 파일에 넣고 다음과 같이 표준 입력을 통해 --upload-file
echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -
niken이것은 나를 위해 일했습니다.
curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
Amit Vujic이 질문에 대한 많은 답변이 있었지만 다음과 같은 문제가 발생한 위치를 공유하고 싶었습니다.
curl -X POST http://your-server-end-point -H "콘텐츠 유형: 애플리케이션/json" -d @path-of-your-json-file.json
봐, 내가 모든 것을 올바르게 했다 . JSON 파일 경로 앞에 놓친 "@" 단 한 가지.
인터넷에서 관련 문서 하나를 찾았습니다 - https://gist.github.com/subfuzion/08c5d85437d5d4f00e58
그것이 소수를 도울 수 있기를 바랍니다. 감사 해요
Indrajeet Gour포함할 동적 데이터가 있는 경우 다른 방법이 있습니다.
#!/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"
Anand Rockzz웹 서버에서 테스트하기 위해 아래 형식을 사용하고 있습니다.
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"}'
user3180641-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'을 사용하여 콘텐츠 유형 헤더 추가
Sma Ma이것은 Windows10에서 나를 위해 일했습니다.
curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X PUT http://localhost:8080/api/changeowner/CAR4
sudhanshu srivastava이를 위해 fetcher 라는 도구를 만들었습니다. 요청을 보내고 컬 스니펫을 형식화할 수 있습니다.
다음은 예입니다.
출력 예:
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"
Pranay KumarSWAGGER를 스프링 부트 애플리케이션으로 구성하고 애플리케이션에서 API를 호출하면 해당 CURL 요청도 볼 수 있습니다.
이것이 CURL을 통해 요청을 생성하는 쉬운 방법이라고 생각합니다.
AnilkumarReddypowershell의 경우 다음을 사용했습니다.
curl.exe -H "Content-Type: application/json" --data "@content.json" http://localhost:8080/appname/path
여기서 content.json은 요청이 포함된 로컬의 json 파일 이름이었고, Invoke-WebRequest에 대한 별칭을 사용하지 않기 위해 curl
대신 curl.exe
meJustAndrewhttps://stackoverflow.com/a/57369772/2391795 답변을 기반으로 GitHub Actions에서 수행한 작업은 다음과 같습니다. 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.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
Vadorequest원하는 형식의 확장자를 url의 끝으로 전달할 수 있습니다. http://localhost:8080/xx/xxx/xxxx .json과 같이
또는
http://localhost:8080/xx/xxx/xxxx .xml
참고: pom.xml 파일에 jackson 및 jaxb maven 종속성을 추가해야 합니다.
Saurabh Oza출처 : 여기를 클릭하세요
출처 : http:www.stackoverflow.com/questions/7172784/how-do-i-post-json-data-with-curl