使用 PHP 从 CURL“-d”检索数据

Retrieve data from CURL "-d" using PHP

这个问题不是关于如何在 PHP 中使用 CURL。但是如何检索使用带“-d”选项的 CURL 发送的数据。

这个命令:

curl -H 'Content-Type: text/plain; charset=utf-8' -d 'Hello, World!' -X POST http://localhost:8080

将在 $_POST 变量中生成空数组。

有人知道吗?谢谢。

我认为这是一个 header 冲突。您尝试发送 text/plain 但不是 form

让我们尝试创建一个 php 文件:

<?php
var_dump($_SERVER);
var_dump($_POST);
var_dump(file_get_contents('php://input'));
?>

运行 built-in 服务器 php -S localhost:8000 path_to_file.php

 curl -d 'Hello, World!' -X POST http://localhost:8000
  # ...
  # ["CONTENT_TYPE"]=>
  # string(33) "application/x-www-form-urlencoded"      < --- FORM
  # ["HTTP_CONTENT_TYPE"]=>
  # string(33) "application/x-www-form-urlencoded"
  # ...
  # array(1) {                                   < ---- DATA HERE
  #  ["Hello,_World!"]=>
  #  string(0) ""
  # }
  # string(13) "Hello, World!"             < ---- AND INPUT HERE

  curl -H 'Content-Type: text/plain; charset=utf-8' -d 'Hello, World!' -X POST http://localhost:8000
  # ...
  # ["CONTENT_TYPE"]=>
  # string(25) "text/plain; charset=utf-8"         < ------ TEXT
  # ["HTTP_CONTENT_TYPE"]=>
  # string(25) "text/plain; charset=utf-8"
  # ...
  # array(0) {                         < ---- EMPTY
  # }
  # string(13) "Hello, World!"             < ---- BUT INPUT HERE

让我们尝试发送 multipart/form-data:

curl -F key1=val1 -F key2=val2 -X POST http://localhost:8000
# ...  FORM .......
#  ["CONTENT_TYPE"]=>
#  string(70) "multipart/form-data; boundary=------------------------2abad5506f8862a5"
#  ["HTTP_CONTENT_TYPE"]=>
#  string(70) "multipart/form-data; boundary=------------------------2abad5506f8862a5"
#  ["REQUEST_TIME_FLOAT"]=>
# ...
# array(2) {                              < ------ DATA HERE
#  ["key1"]=>
#  string(4) "val1"
#  ["key2"]=>
#  string(4) "val2"
# }
# string(0) ""                    <- BUT INPUT EMPTY

让我们试试 json:

curl --header "Content-Type: application/json" --request POST --data  '{"hey":"joe"}' http://localhost:8000
# array(0) {                        < ----- EMPTY
# }
# string(13) "{"hey":"joe"}"        < ----- INPUT HERE

所以我认为在你的情况下,造成这种行为的主要原因是 request headers