【问题标题】:cURL POST: 400 Invalid content lengthcURL POST:400 内容长度无效
【发布时间】:2012-04-29 02:05:51
【问题描述】:

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

我正在尝试制作一个代理,主要是为了我自己的个人使用,它将通过服务器获取网页并在本地显示给我。

网址如下所示: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);
}

【问题讨论】:

    标签: php post curl


    【解决方案1】:

    你有几个问题:

    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

    【讨论】:

    • 你可以只做$fields_str=http_build_query($_POST)php.net/manual/en/function.http-build-query.php,而不是foreach循环
    • @LawrenceCherone:哈,太棒了。我没有意识到它的存在!每天学些新东西。 :)
    • 我还需要在查询中使用 urlencode 吗?看来我无法使用此项目登录 Hotmail - 它说我的电子邮件和密码是正确的,但我看到了查询并且显示正常。
    • 默认情况下,http_build_query 会自动对值进行 URL 编码(根据 RFC 1738)。
    • 奇数。不知道为什么我不能用它进入 Hotmail - 它说它不正确。我会调查的。谢谢! :)
    【解决方案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));
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多