如何在PHP中使用curl GET发送原始数据?

时间:2019-06-24 15:40:50

标签: php curl php-curl

我正在开发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_GETFIELDSCURLOPT_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做到这一点?

1 个答案:

答案 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与数据一起使用。