使用 cURL 发布数据时“需要长度”

发布于 2024-11-07 15:11:48 字数 1704 浏览 9 评论 0原文

当向服务器提交帖子字符串时,我不断收到

Length required

错误。

$cookie = "Secret cookie data here";

$searchData = array(
        '__EVENTTARGET' => 'ctl00$main$btn',
        'ctl00$main$tbMNr' => $_GET['smth'],
        'ctl00$main$tbMb' => $_GET['smthElse'],
        '__VIEWSTATE' => 'smthElseHere'
);

// Commenting this out, as suggested by user lonesomeday
//foreach ($searchData as &$elem) // This should not be necessary
//    $elem = urlencode($elem);


// create a new cURL resource

$fields = http_build_query($searchData); // Assuming it's an array

if ($ch = curl_init("http://mysite.com"))
{
        // set URL and other appropriate options
        curl_setopt($ch, CURLOPT_COOKIE, $cookie);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_POST, true); // Suggestion from Berry Langerak - no difference, same error
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
}



$result = curl_exec($ch);
if ($result === false) {
    echo 'Curl error: ' . curl_error($ch);
}
echo "<pre>".$fields."</pre>".$result; // For debugging ONLY

curl_close($ch);

如果我注释掉 CURLOPT_POSTFIELDSCURLOPT_POST,一切都很好。

有什么建议吗?

编辑

当我添加此行时

curl_setopt($ch, CURLOPT_HEADER, array('Content-Type:application/x-www-form-urlencoded'));

,我在 Length required 之前看到此错误

HTTP/1.1 411 长度必需 内容类型:text/html 日期:2011 年 5 月 16 日星期一 10:20:54 GMT 连接:关闭 内容长度:24

I keep getting a <h1>Length required</h1> error, when submitting a post string to a server.

$cookie = "Secret cookie data here";

$searchData = array(
        '__EVENTTARGET' => 'ctl00$main$btn',
        'ctl00$main$tbMNr' => $_GET['smth'],
        'ctl00$main$tbMb' => $_GET['smthElse'],
        '__VIEWSTATE' => 'smthElseHere'
);

// Commenting this out, as suggested by user lonesomeday
//foreach ($searchData as &$elem) // This should not be necessary
//    $elem = urlencode($elem);


// create a new cURL resource

$fields = http_build_query($searchData); // Assuming it's an array

if ($ch = curl_init("http://mysite.com"))
{
        // set URL and other appropriate options
        curl_setopt($ch, CURLOPT_COOKIE, $cookie);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_POST, true); // Suggestion from Berry Langerak - no difference, same error
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
}



$result = curl_exec($ch);
if ($result === false) {
    echo 'Curl error: ' . curl_error($ch);
}
echo "<pre>".$fields."</pre>".$result; // For debugging ONLY

curl_close($ch);

If I comment out the CURLOPT_POSTFIELDS and CURLOPT_POST, everything is fine.

Any suggestions?

Edit

When I add this line

curl_setopt($ch, CURLOPT_HEADER, array('Content-Type:application/x-www-form-urlencoded'));

I see this error, right before Length Required

HTTP/1.1 411 Length Required Content-Type: text/html Date: Mon, 16 May 2011 10:20:54 GMT Connection: close Content-Length: 24

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

走走停停 2024-11-14 15:11:48

你的用法完全混乱和混乱。

  1. 不要自己更改 Content-Length,而是让 libcurl 这样做,以便它变得正确。

  2. 您打算进行多部分表单提交(将哈希数组传递给 POSTFIELDS 选项)还是“常规”表单(将字符串传递给 POSTFIELDS 选项)?接收者很可能会采用其中一种,而您不能随意选择一种类型。

  3. 当您有正确的 POST 并且您知道您正确发送了数据(验证记录的浏览器使用情况)时,然后您可以看到服务器所说的内容,如果它仍然坚持认为有问题,那么您回顾录制的会话并调整您的请求以使其更类似于该会话。冲洗并重复直到它起作用。

Your usage is completely mixed up and confused.

  1. Don't change Content-Length yourself but let libcurl do it so that it gets correct.

  2. Are you intending to do a multipart formpost (pass a hash array to the POSTFIELDS option) or a "regular" one (pass a string to the POSTFIELDS option) ? The receiver will mostly likely assume one of them and you can't just randomly select a type at your own will.

  3. When you have the correct POST and you know you send the data correctly (verify against a recorded brower use), then you can see what the server says and if it still insists something is wrong then you look back on the recorded session and adjust your request to be more similar to that. Rinse and repeat until it works.

九厘米的零° 2024-11-14 15:11:48

嗯,我没有看到您告诉 cURL 您的意图是执行 POST 请求。添加以下选项:

curl_setopt($ch, CURLOPT_POST, true);

这可能会解决问题。

Ehrm, I don't see you telling cURL that your intent is to do a POST request. Add the following option:

curl_setopt($ch, CURLOPT_POST, true);

That might fix the issue.

罗罗贝儿 2024-11-14 15:11:48

只是为了那些有相同症状的人而添加:

如果您要发布到 IIS 6 并且没有任何内容,您仍然需要发送 Content-Length: 0 否则它会抱怨“需要长度”。

Just wanted to add for the sake of people who came here with the same symptoms:

If you are POSTing to IIS 6 and do not have any Content, you still need to send Content-Length: 0 or it will complain "Length Required".

挽袖吟 2024-11-14 15:11:48

编辑:您是否也尝试删除 &放大器; ?

http_build_query($array, '', '&');

=============

您是否尝试注释掉

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($fields)));

您的 cookie 数据是否有效?

尝试放置代理:

$agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)";
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
  • 设置推荐人:

    curl_setopt($ch, CURLOPT_REFERER,$url);

EDIT : Did you also try to remove the & amp; ?

http_build_query($array, '', '&');

=============

Did you try to comment out

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($fields)));

And is your cookie data valid?

Try to put an agent in :

$agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)";
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
  • Set up a referrer :

    curl_setopt($ch, CURLOPT_REFERER,$url);

岁月染过的梦 2024-11-14 15:11:48
$query ="email=".urlencode($usernames[$key]."@sktechno.net")."&firstName=".urlencode($usernames[$key])."&lastName=".urlencode($lastnames[$key]);

$headerX = array(
'ISV_API_KEY: f6c1c52d03f49c9b4f94150256f2f0dcec6ada1d175d06e990e2d692f443a2db',
'ISV_API_SECRET: 8ae599feda50db968cf4b536e7d79e4ad2d6bd60f41715336b73002819795cc0'
);


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerX);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
$query ="email=".urlencode($usernames[$key]."@sktechno.net")."&firstName=".urlencode($usernames[$key])."&lastName=".urlencode($lastnames[$key]);

$headerX = array(
'ISV_API_KEY: f6c1c52d03f49c9b4f94150256f2f0dcec6ada1d175d06e990e2d692f443a2db',
'ISV_API_SECRET: 8ae599feda50db968cf4b536e7d79e4ad2d6bd60f41715336b73002819795cc0'
);


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerX);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
笑梦风尘 2024-11-14 15:11:48

CURLOPT_POST=>true

在curl中设置

CURLOPT_POST=>true

set in the curl

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文