【问题标题】:GET request via CURL in PHP在 PHP 中通过 CURL 获取请求
【发布时间】:2016-05-14 22:18:55
【问题描述】:

我有如下 CURL 脚本:

$url= 'https://www.test.com/test.php';
$msg=?p1={1250.feed}&p2={jt2221}&p3={1330}&p4={1234567890}&p5={2016-02-04 20:05:34}&p6={New York}; 

$url .= $msg;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
if (curl_errno($ch)) {
    echo 'Error: ' . curl_error($ch);
}
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

var_dump($http_status);
var_dump($result);

完整的字符串 url 和 message ,当我在 Chrome 网络浏览器上复制/粘贴时,远程 PHP 文件接收良好。当 PHP 脚本发送的相同 url+消息不起作用时。我想问题首先是远程域是 HTTPS ,其次是大括号和空格干扰了 CURL 请求。我尝试了 urlencode($msg) 函数然后得到了 Error 404 。成功发送消息后,远程 PHP 返回 {"Code":null,"Msg":"."} 作为 ACK

【问题讨论】:

  • 尝试将标志CURLOPT_SSL_VERIFYPEER关闭为false,并添加一个浏览器代理以及CURLOPT_USERAGENT,只需在网上搜索它就可以得到这两个没有问题
  • 我添加了这些行: curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36');我现在收到错误请求 HTTP 错误 400。请求格式错误。

标签: php curl


【解决方案1】:

如果您使用urlencode,您只需对值进行编码,而不是对整个查询字符串进行编码。一个有效的方法是使用http_build_query

$url= 'https://www.test.com/test.php?';

$data = array('p1' => '{1250.feed}',
              'p2' => '{jt2221}',
              'p3' => '{1330}',
              'p4' => '{1234567890}',
              'p5' => '{2016-02-04 20:05:34}',
              'p6' => '{New York}',);

$msg = http_build_query($data);

$url .= $msg;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
curl_close($ch);
if (curl_errno($ch)) {
    echo 'Error: ' . curl_error($ch);
}
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

var_dump($http_status);
var_dump($result);

【讨论】:

  • 'p6' => '{纽约}',); York 之后的最后一个数组中是否需要最后一个逗号?
  • 不,这只是一种习惯,如果您添加更多值会变得更容易,但否则不会有任何区别。 See this question 如果您热衷于对该主题进行更多讨论。
  • Bingo,Ghost 的 CURLOPT_SSL_VERIFYPEER 需要添加,John 的完整代码现在都可以使用。只需取消注释 CURLOPT_SSL_VERIFYPEER 行
  • 干得好。禁用 SSL 验证应该是一种临时解决方法,我建议您查看 this answer 以使您的脚本以安全的方式运行。
  • 我得到了你的建议,修改如下,并且可以使用 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 2017-03-29
  • 1970-01-01
相关资源
最近更新 更多