php curl -X GET с телом запроса - PullRequest
       4

php curl -X GET с телом запроса

1 голос
/ 12 января 2020

Вот моя проблема. Я запускаю службу на удаленной машине, работающей отлично. Способ получения результатов от машины - через API.

curl -X GET http://ip:777/api \
     -d "r=request" 

Он отлично работает на терминале. Более того, он отлично работает, если запрос запроса короткий. Но однажды это превращается в огромную проблему, он проходит некоторую длину (1800-2000 символов и мне нужно 7k-8k символов).

Однако я не могу "транслитерировать" код curl в PHP , Если есть кто-нибудь с какой-либо идеей, как это сделать, пожалуйста, покажите мне путь. Насколько я знаю, это метод GET curl с REQUEST BODY.

$long_query = "r=" . $request;
// set the api
curl_setopt($ch, CURLOPT_URL, 'http://ip:777/api');
// i want to get the return
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 2min+ timeout as to make sure that I get a result
curl_setopt($ch, CURLOPT_TIMEOUT, 140);

// Set request method to GET by 0'ing the POST method
curl_setopt($ch, CURLOPT_POST, 0);

// Set query data here with CURLOPT_POSTFIELDS
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($long_query));

$content = curl_exec($ch);
curl_close($ch);
echo $content;

Что я здесь не так делаю? Если кто-то знает, пожалуйста, объясните, как будто вы преподаете год. Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 12 января 2020

Хорошо, вот мы go с правильным ответом.

на терминале,

curl -X GET http://ip:777/api \
     -d "r=request" 

работает отлично. Однако проблема с преобразованием этого значения в php curl довольно хлопотная и в то же время очень простая.

Я прочитал все проблемы со стеком, и никто не дал четкого ответа на этот вопрос. проблема. Я не уверен, что причина этого, но как щедрый человек, я дам код, чтобы любой в будущем, столкнувшийся с этой редкой проблемой, мог легко ее решить.

Короче говоря,

curl -X GET -d совпадает с curl -X POST -H "X-HTTP-Method-Override: GET".

Фактическим запросом является POST, но СЕРВЕР будет рассматривать его как GET. Таким образом, вы не столкнетесь с проблемой LONG URI.

$long_query = "r=" . $request;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"ip:777/api");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $long_query);  //Post Fields
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$headers = [
    'X-HTTP-Method-Override: GET',
];

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$server_output = curl_exec ($ch);
curl_setopt($ch, CURLOPT_TIMEOUT, 140);
curl_close ($ch);

var_dump($server_output);

Я установил тайм-аут на 140, поскольку запрос длинный, и серверу через него требуется немного времени go. и ответить (в моем случае это json). Тем не менее, я добавил var_dump, чтобы каждый, кто использует его в будущем, мог видеть, является ли он сериализованным массивом или чем-то еще.

Удачи!

0 голосов
/ 12 января 2020

Я думаю, что следующее действие c поможет вам понять, как работает GET метод. Это из RF C 7231

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

Подробнее см. в этом ответе .

...