curl로 JSON을 PHP에 게시하는 방법


108

나는 기지를 벗어 났을 지 모르지만 오후 내내이 휴게 PHP 프레임 워크 자습서에서 curl post 명령 을 실행하려고 노력해 왔습니다 . 내가 이해하지 못하는 것은 PHP가 내 POST를 해석하는 방법이며 항상 빈 배열로 나타납니다.

curl -i -X POST -d '{"screencast":{"subject":"tools"}}'  \
      http://localhost:3570/index.php/trainingServer/screencast.json

(슬래시는 나를 바보처럼 보이지 않게 만드는 것이지만, PHP 5.2를 사용하여 Windows에서 실행했으며 Linux 서버에서도 시도해 보았습니다. Linux curl과 동일한 버전)

내가 놓친 것이 분명하다. 왜냐하면 꽤 간단 해 보였기 때문이다. 게시물이 제대로 해석되지 않았다면 모든 것이 잘 작동 할 것이다.

이것이 내가 돌려받는 것입니다.

HTTP / 1.1 409 충돌
날짜 : 2009 년 5 월 1 일 금요일 22:03:00 GMT
서버 : Apache / 2.2.8 (Win32) PHP / 5.2.6
X-Powered-By : PHP / 5.2.6
전송 인코딩 : 청크
콘텐츠 유형 : text / html; charset = iso-8859-1

{ "screencast": { "id": null, "subject": null, "body": null,
         "dataUrl": null, "dataMedium": null, "createdOn": null, "author": null}}

.php 파일도 복사하여 붙여 주시겠습니까? URL localhost : 3570 / index.php / trainingServer / screencast.json 이 스크립트를 실행합니까? PHP URL처럼 보이지 않습니다.
pts

@pts; Peter는 어떤 종류의 MVC 프레임 워크를 사용하고 있습니다. 해당 URL에서 index.php를 살펴보십시오.
Alan Storm

@pts 저는 Delphi for PHP (따라서 : 3570)와 Recess MVC 프레임 워크를 .htaccess 파일없이 사용하고 있으므로 url에 index.php /가 있습니다.
Peter Turner

7
로 보내는 것을 잊지 마십시오 application/json.
Gumbo

1
큰 따옴표를 간단한 따옴표에 포함 할 때 이스케이프 할 필요가 없습니다.

답변:


107

$ _POST 배열이 채워지지 않은 이유에 대한 Jordans 분석은 정확합니다. 그러나 사용할 수 있습니다.

$data = file_get_contents("php://input");

http 본문을 검색하고 직접 처리합니다. PHP 입력 / 출력 스트림을 참조하십시오 .

프로토콜 관점에서 이것은 실제로 http multipart 양식 데이터를 처리하지 않기 때문에 실제로 더 정확합니다. 또한 요청을 게시 할 때 application / json을 콘텐츠 유형으로 사용하십시오.


7
json_decode (file_get_contents ( "php : // input"), true)가 작동했습니다. 감사합니다
Peter Turner

내 상황도 정말 도움이되었습니다! 감사합니다 Emil H!
Steve

환상적. 나는 그것이 포스트를 제거하고 있다고 생각하는 Zend와 많은 어려움을 겪고 있었다 .. 나를 위해 일한 간단한 추출. 또한 Peter Turners는 \ stdClass 객체를 제공하는 json_decode ()를 추가했습니다. Garmin API ping 응답에 사용했습니다
JI-Web

120

일반적으로 매개 변수 -d는 양식 인코딩 된 것으로 해석됩니다. -H매개 변수 가 필요합니다 .

curl -v -H "Content-Type: application/json" -X POST -d '{"screencast":{"subject":"tools"}}' \
http://localhost:3570/index.php/trainingServer/screencast.json

18

PHP가 게시 된 데이터가 Querystring 형식 (key = value & key1 = value1) 일 것으로 예상하기 때문에 빈 배열이 발생한다고 생각합니다.

curl 요청을 다음으로 변경해보십시오.

curl -i -X POST -d 'json={"screencast":{"subject":"tools"}}'  \
      http://localhost:3570/index.php/trainingServer/screencast.json

도움이되는지 확인하세요.


네, -H "Content-Type: application/json"저에게 효과가 없었습니다.
PJ Brunet

13

curl이 데이터를 JSON으로 보내도록 몇 가지 추가 플래그를 설정해야합니다.

명령

$ curl -H "Content-Type: application/json" \
       -X POST \
       -d '{"JSON": "HERE"}' \
       http://localhost:3000/api/url

깃발

  • -H: 사용자 정의 헤더, 다음 인수는 헤더 여야합니다.
  • -X: 사용자 정의 HTTP 동사, 다음 인수는 동사로 예상됩니다.
  • -d: HTTP POST 요청의 데이터로 다음 인수를 보냅니다.

자원


1

다음과 같이 따옴표를 이스케이프해야합니다.

curl -i -X POST -d '{\"screencast\":{\"subject\":\"tools\"}}'  \
  http://localhost:3570/index.php/trainingServer/screencast.json

Windows에서 이것은 실제로 나를 위해 일했지만 큰 따옴표를 사용하여 전체 json 문자열을 묶었습니다.
meatvest

Windows에서는 Josef가 위에서 제안한대로 큰 따옴표를 이스케이프해야합니다. 그가 옳다.
Bobo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.