【问题标题】:Translate cURL commands into PHP cURL (Cookies)将 cURL 命令翻译成 PHP cURL (Cookies)
【发布时间】:2017-01-24 20:34:30
【问题描述】:

我需要把这个 cURL 命令翻译成 PHP cURL 代码:

curl -v -b session_cookies.txt -L -H "Content-Type: application/x-www-form-urlencoded" -v -d 'j_username=manager-sitelogin@gmail.com&j_password=site1' "https://login.uat.site.be/openid/login.do"

我试过这个,但它似乎不起作用,结果我一直空着:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://login.uat.site.be/openid/login.do");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "j_username=manager-sitelogin@gmail.com&j_password=site1");
curl_setopt($ch, CURLOPT_POST, 1);
$headers = array();
$headers[] = "Content-Type: application/x-www-form-urlencoded";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_COOKIEJAR, public_path().'/session_cookies.txt');

$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);

dd($result); 我一直收到空字符串,但它在标准 curl 命令中有效。

【问题讨论】:

  • 仅用于调试,添加curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
  • login.uat.site.be是真实地址吗?它对我说“* 无法解析主机:login.uat.site.be”。
  • @axiac :请假设它是。我真的不能把我的客户 URL 扔在这里。对此我感到非常抱歉。
  • 你为什么不使用 guzzle 库,它是 curl 的一个包装器,它可以让你在几行代码中做到这一点?

标签: php curl


【解决方案1】:

看起来你犯了这些错误:

1:您没有启用 CURLOPT_FOLLOWLOCATION。试试curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

2: j_username 和 j_password 未正确编码。 (例如,@ 实际上应该编码为 %40 )尝试curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('j_username'=>'manager-sitelogin@gmail.com','j_password'=>'site1')));

还请注意,您可能不应该手动设置 Content-Type: application/x-www-form-urlencoded ,也许它没有任何区别,但如果我是你,我宁愿让 curl/php 自动设置它(实际上没有机会放错空间或一个错字等),根据文档:Passing an array to CURLOPT_POSTFIELDS will encode the data as multipart/form-data, while passing a URL-encoded string will encode the data as application/x-www-form-urlencoded. - 你正在传递一个字符串。

【讨论】:

  • 感谢您指出我的错误。尤其是url编码一个,好眼睛!很棒的答案!
【解决方案2】:

1) 远程站点使用 HTTPS 协议。所以你必须设置 CA 选项:CURLOPT_CAINFO / CURLOPT_CAPATH。或者,如果您不担心man-in-the-middle attack,您可以通过将CURLOPT_SSL_VERIFYPEER 选项设置为false 来关闭对等方的验证。

2) 您还没有翻译-L 选项。 CURLOPT_FOLLOWLOCATION - PHP 中的对应项。

3) 你翻译了-b 选项错误。 -b 指定要从中读取先前存储的 cookie 的文件。它还激活了 cookie 引擎,这将使 curl 自动记录传入的 cookie。 PHP CURL 没有此选项的直接等效项。 CURLOPT_COOKIE 只接受 cookie 标头的内容,而不接受文件名。 CURLOPT_COOKIEJAR 只指定文件名来保存传入的 cookie,但它不会自动通过请求传递它们。为了重现-b 选项的完整效果,您必须结合使用CURLOPT_COOKIEJARCURLOPT_COOKIEFILE 选项,该选项指定要读取cookie 的文件。这两个选项必须设置为相同的值。也都期望文件的绝对路径。如果您想将 cookie 存储在当前脚本的目录中,您可以将 $_SERVER['PHP_SELF']__FILE__dirname() 函数结合使用。所以public_path() 函数应该返回一个固定的绝对路径或者一个以当前目录为前缀的相对路径。

4) 正如@hanshenrik 所写,POST 数据应该是 URL 编码的,正如请求的内容类型所假定的那样 (application/x-www-form-urlencoded)。最合适的方法是使用http_build_query 函数。

5) 你应该考虑使用curl_setopt_array 函数而不是一堆curl_setopt 调用。

所以代码应该(可能)看起来像这样:

$cookie_file = dirname(__FILE__). '/session_cookies.txt';
$options = array(
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query(array(
        'j_username' => 'manager-sitelogin@gmail.com',
        'j_password' => 'site1',
    )),
    CURLOPT_COOKIEJAR => $cookie_file,
    CURLOPT_COOKIEFILE => $cookie_file,
);
$ch = curl_init();
curl_setopt_array($ch, $options);
curl_setopt($ch, CURLOPT_URL, 'https://login.uat.site.be/openid/login.do');
$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);

【讨论】:

  • 对于这个冗长的详细回答,我非常感谢,感谢您为此付出的时间和精力。阅读您的答案后,我现在确实理解得更好了。干杯!
  • 我已经尝试了你的建议,但仍然遇到一些错误,你能给我更多的提示吗?
  • 我很抱歉。我尝试了您的建议并将详细信息放在我的新帖子中,请看一下,也许您会发现我错过的一些东西。 :stackoverflow.com/q/41855264/4480164
猜你喜欢
  • 2017-06-10
  • 2017-12-20
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多