Cách đăng JSON lên PHP với curl


108

Tôi có thể không có cơ sở, nhưng tôi đã cố gắng cả buổi chiều để chạy lệnh curl post trong hướng dẫn khung PHP giải lao này. Điều tôi không hiểu là PHP phải diễn giải POST của tôi như thế nào, nó luôn xuất hiện dưới dạng một mảng trống.

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

(Dấu gạch chéo ở đó chỉ để khiến tôi trông không giống một tên ngốc, nhưng tôi đã thực hiện điều này từ các cửa sổ sử dụng PHP 5.2, cũng đã thử trên máy chủ Linux, cùng phiên bản với Linux curl)

Phải có điều gì đó tôi đang thiếu vì nó có vẻ khá đơn giản, bài đăng không được diễn giải đúng, nếu đúng như vậy, mọi thứ sẽ hoạt động tốt.

Đây là những gì tôi nhận lại:

Xung đột HTTP / 1.1 409
Ngày: Thứ Sáu, ngày 01 tháng 5 năm 2009 22:03:00 GMT
Máy chủ: Apache / 2.2.8 (Win32) PHP / 5.2.6
X-Powered-By: PHP / 5.2.6
Chuyển-Mã hóa: chunked
Nội dung-Loại: text / html; bảng mã = ​​iso-8859-1

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

Bạn cũng có thể sao chép-dán tệp .php của mình không? Bạn có chắc chắn rằng URL localhost: 3570 / index.php / trainingServer / screencast.json chạy tập lệnh của bạn không? Nó không giống như một URL PHP.
pts

@pts; Peter đang sử dụng một khung công tác MVC nào đó, hãy xem index.php trong URL đó.
Alan Storm

@pts Tôi đang sử dụng Delphi cho PHP (do đó là: 3570) và khuôn khổ Recess MVC với tệp .htaccess, do đó có index.php / trong url.
Peter Turner

7
Đừng quên gửi nó dưới dạng application/json.
Gumbo

1
Không cần thiết phải thoát khỏi dấu ngoặc kép khi nhúng chúng vào những dấu ngoặc kép đơn giản.

Câu trả lời:


107

Phân tích của Jordans về lý do tại sao mảng $ _POST không được điền là chính xác. Tuy nhiên, bạn có thể sử dụng

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

để chỉ lấy phần thân http và tự xử lý. Xem các luồng đầu vào / đầu ra của PHP .

Từ góc độ giao thức, điều này thực sự đúng hơn, vì dù sao thì bạn cũng không thực sự xử lý dữ liệu biểu mẫu nhiều phần http. Ngoài ra, hãy sử dụng ứng dụng / json làm loại nội dung khi đăng yêu cầu của bạn.


7
Việc làm json_decode (file_get_contents ("php: // input"), true) đã hoạt động. Cảm ơn
Peter Turner

Thực sự đã giúp đỡ hoàn cảnh của tôi! Cảm ơn Emil H!
Steve

TUYỆT DIỆU. Tôi đã gặp rất nhiều rắc rối với Zend khi nghĩ rằng nó đang tước bỏ bài đăng .. Một trích xuất đơn giản phù hợp với tôi. Peter Turners cũng bổ sung json_decode () cung cấp một đối tượng \ stdClass. Tôi đã sử dụng nó cho các phản hồi ping API Garmin
JI-Web

120

Thông thường, tham số -dđược hiểu là mã hóa biểu mẫu. Bạn cần -Htham số:

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

18

Tôi tin rằng bạn đang nhận được một mảng trống vì PHP đang mong đợi dữ liệu đã đăng ở định dạng Chuỗi truy vấn (key = value & key1 = value1).

Hãy thử thay đổi yêu cầu uốn tóc của bạn thành:

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

và xem nếu điều đó giúp bất kỳ.


Vâng, -H "Content-Type: application/json"không làm việc cho tôi.
PJ Brunet

13

Bạn cần đặt thêm một vài cờ để curl gửi dữ liệu dưới dạng JSON.

chỉ huy

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

cờ

  • -H: tiêu đề tùy chỉnh, đối số tiếp theo được mong đợi là tiêu đề
  • -X: động từ HTTP tùy chỉnh, đối số tiếp theo được mong đợi là động từ
  • -d: gửi đối số tiếp theo dưới dạng dữ liệu trong một yêu cầu HTTP POST

tài nguyên


1

Bạn nên thoát khỏi các dấu ngoặc kép như sau:

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

Trên Windows, điều này thực sự hiệu quả với tôi, nhưng sử dụng dấu ngoặc kép để bao quanh toàn bộ chuỗi json.
Meatvest

trên windows, bạn phải thoát khỏi dấu ngoặc kép như Josef đã đề xuất ở trên. Anh ấy đúng.
Bobo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.