3

我在 PHP 中使用 cURL 脚本发送 POST 请求时遇到问题。

我正在尝试制作一个代理,基本上,供我个人使用,它将通过服务器获取网页并在本地显示给我。

URL 如下所示:http://fetch.example.com/http: //theurl.com/

当我在该页面上的表单中发布时,它将转到表单的 ACTION(前面带有获取 URL)。我试图让它使用下面的代码处理这个 POST 请求,但是我发布的任何内容总是会带来 400 Bad Request 错误。

$chpg = curl_init();
curl_setopt($chpg, CURLOPT_URL, $_URL);
curl_setopt($chpg, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($chpg, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($chpg, CURLOPT_COOKIESESSION, true);
curl_setopt($chpg, CURLOPT_COOKIEJAR, "cookies/$_COOKIE_FILE.$_DOMAIN.txt");
curl_setopt($chpg, CURLOPT_COOKIEFILE, "cookies/$_COOKIE_FILE.$_DOMAIN.txt");
if($_POST) {
    $fields = array();
    foreach($_POST as $col => $val) {
        $fields[$col] = urlencode($val);
    }
    print_r($fields);
    curl_setopt($chpg, CURLOPT_POST, count($fields));
    curl_setopt($chpg, CURLOPT_POSTDATA, $fields);
}
4

2 回答 2

3

你有几个问题:

  1. CURLOPT_POSTDATA应该是CURLOPT_POSTFIELDS

  2. 您将$fields PHP 数组作为 CURLOPT_POSTFIELDS. 这实际上需要是格式中的字符串name1=value1&name2=value2&...

    要解决这些问题,请按如下方式修改您的 PHP 代码:

    if($_POST) {
        $fields_str = http_build_query($_POST);
    
        curl_setopt($chpg, CURLOPT_POST, count($_POST));
        curl_setopt($chpg, CURLOPT_POSTFIELDS, $fields_str);
    }
    

    正如Lawrence Cherone指出的那样,您可以放弃foreach循环并http_build_query改用。

于 2012-04-29T02:43:22.530 回答
2

尝试使用http_build_query并修复CURLOPT_POSTFIELDS

$chpg = curl_init();
curl_setopt($chpg, CURLOPT_URL, $_URL);
curl_setopt($chpg, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($chpg, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($chpg, CURLOPT_COOKIESESSION, true);
curl_setopt($chpg, CURLOPT_COOKIEJAR, "cookies/$_COOKIE_FILE.$_DOMAIN.txt");
curl_setopt($chpg, CURLOPT_COOKIEFILE, "cookies/$_COOKIE_FILE.$_DOMAIN.txt");
if($_POST) {
    curl_setopt($chpg, CURLOPT_POST, count($_POST));
    curl_setopt($chpg, CURLOPT_POSTFIELDS, http_build_query($_POST));
}
于 2012-04-29T03:08:40.633 回答