Php cURL POST:400无效的内容长度

Php cURL POST:400无效的内容长度,php,post,curl,Php,Post,Curl,我用PHP中的cURL脚本发送POST请求时遇到问题 我正在尝试制作一个代理,本质上是为我个人使用,它将通过服务器获取网页并在本地显示给我 URL如下所示:http://fetch.example.com/http://theurl.com/ 当我在该页面上发布表单时,它将转到表单的操作(前面是获取URL)。我试图让它使用下面的代码处理这个POST请求,但是我发布的任何东西都会带来400个错误请求 $chpg = curl_init(); curl_setopt($chpg, CURLOPT_U

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

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

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

当我在该页面上发布表单时,它将转到表单的操作(前面是获取URL)。我试图让它使用下面的代码处理这个POST请求,但是我发布的任何东西都会带来400个错误请求

$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);
}

你有几个问题:

  • CURLOPT\u POSTDATA
    应该是
    CURLOPT\u POSTFIELDS

  • 您将
    $fields
    PHP数组作为
    CURLOPT_POSTFIELDS
    。这实际上需要是 格式化
    name1=value1&name2=value2&…

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

    if($\u POST){
    $fields\u str=http\u build\u查询($\u POST);
    curl_setopt($chpg,CURLOPT_POST,count($_POST));
    curl_setopt($chpg,CURLOPT_POSTFIELDS,$fields_str);
    }
    
    如前所述,您可以放弃
    foreach
    循环,改用

  • 使用&fixed
    CURLOPT\u 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));
    }
    

    代替foreach循环,你可以只做
    $fields\u str=http\u build\u query($\u POST)
    @lawrencerone:Ha,太棒了。我没有意识到它的存在!每天学习新东西。:)我是否还需要在查询中使用urlencode?似乎我不能用这个项目登录Hotmail-它说我的电子邮件和密码是正确的,但是我看到了查询,它显示的很好。默认情况下
    http\u build\u query
    将自动对值进行URL编码(根据RFC 1738)。奇数。不知道为什么我不能用它进入Hotmail,它说这是不正确的。我会调查的。谢谢!:)