Terminal/Commandline에서 Curl로 JSON 데이터를 POST하여 Spring REST를 테스트하는 방법?



spring-mvc (14)

우분투를 사용하고 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 명령의 올바른 형식에 대한 아이디어가 있습니까?

편집하다:

이건 내 자바 사이드 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 Windows를 사용하여 다음을 시도하십시오.

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

JSON 파일 "MyData.json"을 만들고 내용을 추가하십시오.

[
    {
        "Key_one": "Value_one",
        "Key_two": "Value_two",
        "Key_three": "Value_three"
    }
]

그 후에 다음 명령을 실행해야합니다.

curl -v -H "Content-Type: application/json" -X POST --data @MyData.json -u USERNAME:PASSWORD http://localhost:8000/env/add_server

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

content-type을 application / json으로 설정해야합니다. 그러나 -d 는 Content-Type application/x-www-form-urlencoded 를 전송하는데, 이는 Spring 측에서 허용되지 않습니다.

컬 맨 페이지를 보면, -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 )

-d 플래그를 사용하면 POST 요청을 의미하므로 -request POST선택 사항 입니다.

Windows에서 상황은 약간 다릅니다. 코멘트 스레드를 참조하십시오.


그것은 나를 위해 일했다 :

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 입니다.


나는 단지 같은 문제에 부딪쳤다. 나는 그것을 지정함으로써 그것을 해결할 수 있었다.

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

내 응용 프로그램에서 JSON을 사용하면 다음과 같이 간단합니다.

curl -X POST -H "Content-Type:application/json" -d '{"params1":"value1","params2":"value2"} hostname:port/api

그러나 많은 수의 매개 변수가있는 경우 항상 JSON 요청 본문이있는 파일을 다음과 같이 사용하는 것이 좋습니다.

curl -X POST -H "Content-Type:application/json" -F "[email protected]/users/suchi/dekstop/JSON_request.txt" hostname:port/api

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

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

예를 들어 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 -X POST --data @json_out.txt http://localhost:8080/

어디에,

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

--data 데이터 전송하려는 데이터를 의미합니다.


이것은 나에게 잘 맞았고, 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 및 확인 된 인증서 없이는 기본 인증을 사용하지 않아야합니다.

Windows 용 Cygwin의 cURL 7.49.1을 사용하여 오늘도이 문제에 봉착했습니다 ... JSON 인수에 --data 또는 --data-binary 사용하면 cURL이 혼란스러워서 JSON의 {} 을 URL로 해석합니다 주형. cURL globbing을 끄기 위해 -g 인수를 추가하여이를 수정했습니다.

URL을 괄호로 전달하여 말리기를 참조하십시오.


파티에 좀 늦었지만 게시 된 것을 볼 수 없으므로 여기에 json을 파일에 넣고 표준 입력을 통해 --file-upload 옵션을 사용하여 파일을 넘길 수 있습니다.

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

HTTPiecurl 권장되는 대안입니다.

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

그것은 기본적으로 JSON을 말하고 유효한 JSON으로 인코딩 데이터뿐만 아니라 당신을 위해 필요한 헤더를 설정합니다. 도 있습니다:

Some-Header:value

헤더의 경우

name==value

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

 [email protected]




curl