【问题标题】:php curl -X GET with request bodyphp curl -X GET 请求正文
【发布时间】:2020-01-12 08:40:11
【问题描述】:

这是我的问题。我正在一台运行良好的远程机器上运行一项服务。机器获取结果的方式是通过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;

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

【问题讨论】:

标签: php curl get


【解决方案1】:

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

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

更多详情请参考此answer

【讨论】:

    【解决方案2】:

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

    在终端上,

    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,以便将来使用它的任何人都可以查看它是序列化数组还是其他什么。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2020-10-10
      • 2018-03-30
      • 2016-02-22
      • 1970-01-01
      相关资源
      最近更新 更多