繁体   English   中英

php curl -X GET 请求正文

[英]php curl -X GET with request body

这是我的问题。 我在远程机器上运行服务,运行良好。 从机器获取结果的方式是通过api。

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

它在终端上完美运行。 此外,如果请求查询很短,它可以完美运行。 但是,它一旦变成一个大问题,它会传递一些长度(1800-2000 个字符,我需要 7k-8k 个字符)。

但是,我无法将 curl 代码“音译”为 PHP。 如果有人知道怎么做,请告诉我方法。 据我所知,这是一个带有 REQUEST BODY 的 curl GET 方法。

$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;

我在这里做错了什么? 如果有人知道,请像教一岁的孩子一样解释。 提前致谢!

我认为以下文档将帮助您了解GET方法的工作原理。 这是来自RFC 7231

GET 请求消息中的负载没有定义的语义; 在 GET 请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。

有关更多详细信息,请参阅此答案

好的,我们来看看正确的答案。

在终端,

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

完美地工作。 但是,将其转换为 php curl 的问题非常麻烦,同时也很容易。

我已经通读了与此相关的每个堆栈问题,但没有人为该问题提供明确的答案。 我不确定背后的原因,但作为一个慷慨的人,我会给出代码,以便将来遇到这个罕见问题的任何人都能轻松解决它。

长话短说,

curl -X GET -dcurl -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,因为查询很长,服务器通过它并响应需要一些时间(在我的情况下它是一个 json)。 尽管如此,我添加了 var_dump 以便将来使用它的任何人都可以查看它是否是序列化数组或其他任何东西。

祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM