GET 请求没有主体,这就是整个想法:您只是从服务器获取一些内容,而不是向服务器发布一些内容。从RFC 7231 https://www.rfc-editor.org/rfc/rfc7231#section-4.3.1:
GET 请求消息中的有效负载没有定义的语义;
在 GET 请求上发送有效负载正文可能会导致一些现有的
拒绝请求的实现。
换句话说,一个 GET 请求can有数据,但不应该。从规范中较早的部分 https://www.rfc-editor.org/rfc/rfc7231#section-4.2.1,其中 GET 被定义为安全方法:
如果请求方法定义的语义是“安全”的
本质上是只读的;即,客户端没有请求,并且确实
没想到,由于以下原因,源服务器上的任何状态发生变化
将安全方法应用于目标资源。
...
本规范定义的请求方法中,GET、HEAD、
OPTIONS 和 TRACE 方法被定义为安全的。
如果您确实希望在 GET 请求中包含 JSON(并将其发送到合理实现的服务器资源),那么它唯一可以去的地方就是作为查询字符串的一部分放在 URI 中。对于 GET 请求,我发现使用file_get_contents https://www.php.net/manual/en/function.file-get-contents.php比处理 cURL 容易得多。
<?php
$payload = json_encode(["user" => $data]);
$url_data = http_build_query([
"json" => $payload
]);
$url = "https://some.example/endpoint.php?" . $url_data;
$result = file_get_contents($url);
如果你想将其发送到一个不合理实现的服务器资源,并且违反了 HTTP RFC 的精神,你可以这样做:
<?php
$url = "https://some.example/endpoint.php";
$payload = json_encode(["user" => $data]);
$ctx = stream_context_create(["http" => [
"header"=>"Content-Type: application/json",
"content"=>$payload
]]);
$result = file_get_contents($url, false, $ctx);
如果您决定专门使用 cURL 来执行此操作,那么您可能会幸运地使用CURLOPT_CUSTOMREQUEST
选项设置为“GET”并且CURLOPT_POSTDATA
与您的数据。