现在API模式,经常使用headers里传JSON数据,作为POST请求传递参数的方式,在参数量较多时POST JSON要比POST FormData便于开发和测试
PHP发送JSON POST
$url = "http://example.com/request/post/json";
$data = json_encode(["foo" => "bar"]);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-type: application/json"));
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_exec($curl);
curl_close($curl);
或者
/**
* PHP发送Json对象数据
* 例子 list($returnCode, $returnContent) = http_post_json($url, $jsonStr);
* @param $url 请求url
* @param $jsonStr 发送的json字符串
* @return array
*/
function http_post_json($url, $jsonStr)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($jsonStr)
)
);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return array($httpCode, $response);
}
PHP接受JSON POST
$data = json_decode(file_get_contents('php://input'), true);
php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替
$GLOBALS['HTTP_RAW_POST_DATA']
,因为它不依赖于特定的 php.ini 指令。 而且,这样的情况下
$GLOBALS['HTTP_RAW_POST_DATA']
默认没有填充, 比激活 always_populate_raw_post_data
潜在需要更少的内存。 enctype="multipart/form-data" 的时候 php://input 是无效的。
在 PHP 5.6 之前 php://input 打开的数据流只能读取一次; 数据流不支持 seek 操作。 不过,依赖于 SAPI 的实现,请求体数据被保存的时候, 它可以打开另一个 php://input 数据流并重新读取。 通常情况下,这种情况只是针对 POST 请求,而不是其他请求方式,比如 PUT 或者 PROPFIND。