cURL POST:400内容长度无效

时间:2012-04-29 02:05:51

标签: php post curl

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

我正在尝试创建一个代理,基本上是为了我自己的个人用途,它将通过服务器获取网页并在本地显示给我。

网址如下: http://fetch.example.com/http://theurl.com/

当我在该页面上的表单中发布时,它将转到表单的ACTION(前面有fetch 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);
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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));
}