我正在开发 REST API,虽然很容易在 cURL 中为 POST 请求设置原始 JSON 数据
$payload = json_encode(array("user" => $data));
//attach encoded JSON string to the POST fields
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何使用 GET 请求发送此类数据。
有什么样CURLOPT_GETFIELDS还是CURLOPT_RAWDATA?使用 GET 请求发送 JSON 的目的是传入一些参数。
我不希望将 formdata 添加到请求中,我希望发布 JSON 以便它可以在接收器上进行解析。
谢谢!
编辑:
基于我想避免混淆的评论,因此生成的请求应如下所示:
GET / HTTP/1.1
Host: 127.0.0.1:3000
Content-Type: application/json
Accept: application/json
Host: 127.0.0.1:3000
content-length: 13
Connection: keep-alive
cache-control: no-cache
{
"a": "b"
}
Run Code Online (Sandbox Code Playgroud)
如您所见,此处的 GET 请求具有数据,并且由 Web 服务器解析并完美运行。我如何使用 cURL 实现这一点?
GET 请求没有主体,这就是整个想法:您只是从服务器获取一些东西,而不是向它发布一些东西。来自RFC 7231:
GET 请求消息中的负载没有定义的语义;在 GET 请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。
换句话说,GET 请求可以有数据,但不应该。从前面的规范开始,GET 被定义为一个安全的方法:
如果请求方法定义的语义本质上是只读的,则它们被认为是“安全的”;即,客户端不会请求,也不期望将安全方法应用于目标资源而导致源服务器上的任何状态更改。
...
在本规范定义的请求方法中,GET、HEAD、OPTIONS 和 TRACE 方法被定义为安全的。
如果您真的希望在 GET 请求中包含 JSON(并将其发送到合理实现的服务器资源),那么它唯一可以去的地方是作为查询字符串一部分的 URI。对于 GET 请求,我发现使用file_get_contents它比处理 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);
Run Code Online (Sandbox Code Playgroud)
如果你想把它发送到一个不合理实现的服务器资源,并且违反了 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);
Run Code Online (Sandbox Code Playgroud)
如果您决定专门使用 cURL 来执行此操作,那么您可能会很幸运地将CURLOPT_CUSTOMREQUEST选项设置为“GET”并CURLOPT_POSTDATA使用您的数据。