Curl返回400个错误请求(带有空格的url)


Curl returns 400 bad request (url with spaces)

当我使用curl库并尝试从url获取图像时,我收到了400个错误的请求错误。我发现问题出在编码url上。但在我的情况下,它不起作用,因为我的url——它是服务器端图像的路径——就像一样

http://example.com/images/products/product 1.jpg

我知道在名称文件中使用用户空间是不好的做法,但这不是我的服务器,也不是我创建的那些文件。

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, urlencode($url));
echo $ret = curl_exec($ch);

当我使用urlencode函数时-curl返回http_code=0

更新

$url = str_replace(' ', '+', $url);

不工作,服务器返回404错误

这可能有效吗?

$url = 'http://host/a b.img';
$url = str_replace(" ", '%20', $url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
echo $ret = curl_exec($ch);

您需要使用rawurlencode()函数:

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, rawurlencode($url));
echo $ret = curl_exec($ch);

必须始终首选rawurlencode()。urlencode()仅保留用于遗留使用。有关更多详细信息,请查看此SO答案。

您不能对整个字符串进行url编码,因为这将对斜杠和其他需要保持未编码的内容进行编码。如果空间是你唯一的问题,这将做到:

str_replace(' ', '+', $url);

使用curl比其他方法更具挑战性。只需使用shell_exec

$cmd = "curl -k -v -X POST 'https://serveraddress:8243/?foo=bar' -H 'Authorization: Basic cEZ.....h'";
$result = shell_exec($cmd);         
$output =  json_decode($result,true);
print_r($output);