3

我试图弄清楚为什么我没有看到带有 $.post("/url/", {wtf: 2}) 的参数。

我正在使用这个 perl:

use strict;
use CGI;

my $cgi = new CGI;
print $cgi->header("text/javascript");
print "'no'";

use Data::Dumper;
warn Dumper({ (map {$_=>$cgi->param($_ )} $cgi->param), postdata=>$cgi->param("POSTDATA") });

当我发出 $.get("/url", {wtf: 2}) 时,我得到了我期望的结果,并在日志中发现 wtf 为 2。当我使用 $.post("/url/", {wtf: 2}) 时,我似乎根本没有得到任何参数(日志中只有一个 $VAR1 = { postdata=>undef })。

我错过了什么?

Firebug 显示:Transfer-Encoding 是“分块”,Content-Type 是“application/x-www-form-urlencoded; charset=UTF-8”。此外,Post 选项卡似乎显示了请求中的参数,但 CGI 没有任何乐趣。

4

3 回答 3

4

可能是您的结果既没有返回 application/x-www-form-urlencoded 也没有返回 multipart/form-data。CGI doc对此有这样的说法:

如果 POST 数据的类型不是 application/x-www-form-urlencoded 或 multipart/form-data,则不会处理 POST 数据,而是在名为 POSTDATA 的参数中按原样返回。要检索它,请使用如下代码:

    my $data = $query->param('POSTDATA');
于 2009-02-24T22:40:29.910 回答
2

如果您可以访问 linux 机器,您可以设置 'nc' (netcat) 以侦听端口 80 并查看您收到的原始请求。

我怀疑这是一个服务器端的问题。也许某些 Apache 配置有干扰?抱歉,我无法提供更多帮助。

于 2009-02-25T21:32:36.243 回答
2

我遇到了同样的问题,尽管我使用的是 CGI::Lite。

原来 jquery 中的 .post 函数似乎覆盖了表单的内容类型,即使它已被明确设置。一个简单的“ngrep”显示它总是通过:

application/x-www-form-urlencoded; charset=UTF-8 

问题是,CGI::Lite 模块只期望完全匹配 'application/x-www-form-urlencoded'(即没有字符集位)。

在 CGI/Lite.pm 中将这行代码从完全匹配更改为正则表达式匹配,这对我有用:

#($content_type eq 'application/x-www-form-urlencoded')) {
($content_type =~  /application\/x-www-form-urlencoded/)) {
于 2011-09-07T10:04:55.000 回答