我正在开发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);
我不知道如何通过GET请求发送此类数据。
是否有类似CURLOPT_GETFIELDS
或CURLOPT_RAWDATA
的东西?通过GET请求发送JSON的目的是传递一些参数。
我不希望在请求中添加表单数据,我希望发布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"
}
如您所见,这里的GET请求包含数据,它已被解析并由Web服务器完美运行。如何使用cURL做到这一点?
答案 0 :(得分:2)
GET请求没有主体,这就是整个想法:您只是从服务器获取内容,而不是向其发布内容。来自RFC 7231:
GET请求消息中的有效负载没有定义的语义; 在GET请求上发送有效内容正文可能会导致一些现有内容 拒绝请求的实现。
换句话说,一个GET请求可以有数据,但没有。从earlier in the spec,其中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);
如果要将其发送到不合理实现的服务器资源,并且违反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
与数据一起使用。