我需要将此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($结果); 我一直得到空字符串,但它在标准curl命令中工作。
答案 0 :(得分: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.
- 你传递的是字符串。
答案 1 :(得分:1)
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_COOKIEJAR
与CURLOPT_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);