Как отправить необработанные данные с помощью curl GET в PHP? - PullRequest
0 голосов
/ 24 июня 2019

Я занимаюсь разработкой REST API, и хотя легко установить необработанные данные JSON для запроса в cURL для POST

$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?Целью отправки JSON с GET-запросом является передача некоторых параметров.

Я не хочу добавлять форматы данных в запрос, я хочу опубликовать 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-запрос здесь содержит данные, и он анализируется и отлично работает веб-сервером.Как мне добиться этого с помощью cURL?

1 Ответ

2 голосов
/ 24 июня 2019

GET-запросы не имеют тела, вот и вся идея: вы просто получаете что-то с сервера, а не отправляете что-то на него.Начиная с RFC 7231 :

Полезная нагрузка в сообщении запроса GET не имеет определенной семантики;отправка тела полезной нагрузки по запросу GET может привести к тому, что некоторые существующие реализации отклонят запрос.

Другими словами, запрос GET может иметь данные, но не должен.С ранее в спецификации , где GET определен как безопасный метод:

Методы запроса считаются "безопасными", если их определенная семантика по существу доступна только для чтения;т. е. клиент не запрашивает и не ожидает каких-либо изменений состояния на исходном сервере в результате применения безопасного метода к целевому ресурсу.

...

Изметоды запроса, определенные в этой спецификации, методы GET, HEAD, OPTIONS и TRACE определены как безопасные.

Если вы действительно хотите включить JSON в свой запрос GET (и отправить его разумнореализованный серверный ресурс), единственное место, куда он может пойти - это 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 с вашими данными.

...