【问题标题】:PHP cURL request changes POST dataPHP cURL 请求更改 POST 数据
【发布时间】:2014-04-15 17:00:53
【问题描述】:

我使用 PHP cURL 模块的 POST 请求有问题。我有一个这样的字符串$new_post(因为它太长了,所以在这里剪掉了):

    $new_post = '...AvailabilitySearchInputScheduleSelectView$RadioButtonMarketStructure='.$tipe.'&AvailabilitySearchInputScheduleSelectView$DropDownListMarketDay1='.$tanggal1.'&AvailabilitySearchInputScheduleSelectView$DropDownListMarketMonth1='.$bulan1.'&date_picker='.$bulan1.'-'.$tanggal1.'&AvailabilitySearchInputScheduleSelectView$DropDownListMarketDay2='.$tanggal2.'&AvailabilitySearchInputScheduleSelectView$DropDownListMarketMonth2='.$bulan2.'&date_picker='.$bulan2.'-'.$tanggal2.'&...;

当我使用curl_exec 发布该内容时,POST 字符串会自行更改。子字符串 AvailabilitySearchInputScheduleSelectView 更改为 AvailabilitySearchInputSearchView。我用 Firebug 查了一下。

我不知道为什么会这样。谁能告诉我为什么会这样?这是我的请求代码:

    $data = curl_init();
    curl_setopt($data, CURLOPT_CONNECTTIMEOUT, 180);
    curl_setopt($data, CURLOPT_URL, $url);
    curl_setopt($data, CURLOPT_FAILONERROR,1);
    curl_setopt($data, CURLOPT_FOLLOWLOCATION,1);
    curl_setopt($data, CURLOPT_VERBOSE, 1);
    curl_setopt($data, CURLOPT_POST, true);
    curl_setopt($data, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($data, CURLOPT_POSTFIELDS, $new_post);
    curl_setopt($data, CURLOPT_FAILONERROR,0);
    curl_setopt($data, CURLINFO_HEADER_OUT, true);
    curl_setopt($data, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($data, CURLOPT_COOKIEFILE, $cookie);
    curl_setopt($data, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0");
    $result = curl_exec($data);

*编辑

如果我在真实的网页中这样做,这正是正确的帖子。我试图以同样的方式发布。很抱歉我可以上传我的萤火虫的截图,因为我没有足够的声誉。

__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwUBMGRkBsrCYiDYbQKCOcoq%2FUTudEf14vk%3D&pageToken=&AvailabilitySearchInputScheduleSelectVieworiginStation1=&AvailabilitySearchInputScheduleSelectView%24TextBoxMarketOrigin1=&AvailabilitySearchInputScheduleSelectViewdestinationStation1=&AvailabilitySearchInputScheduleSelectView%24TextBoxMarketDestination1=&AvailabilitySearchInputScheduleSelectVieworiginStation2=&AvailabilitySearchInputScheduleSelectView%24TextBoxMarketOrigin2=&AvailabilitySearchInputScheduleSelectViewdestinationStation2=&AvailabilitySearchInputScheduleSelectView%24TextBoxMarketDestination2=&AvailabilitySearchInputScheduleSelectView%24RadioButtonMarketStructure=RoundTrip&AvailabilitySearchInputScheduleSelectView%24DropDownListMarketDay1=14&AvailabilitySearchInputScheduleSelectView% 24DropDownListMarketMonth1=2014-04&date_picker=2014-04-14&AvailabilitySearchInputScheduleSelectView%24DropDownListMarketDay2=21&AvailabilitySearchInputScheduleSelectView%24DropDownListMarket Month2=2014-04&date_picker=2014-04-21&AvailabilitySearchInputScheduleSelectView%24DropDownListPassengerType_ADT=3&AvailabilitySearchInputScheduleSelectView%24DropDownListPassengerType_CHD=0&AvailabilitySearchInputScheduleSelectView%24DropDownListPassengerType_INFANT=0&AvailabilitySearchInputScheduleSelectView%24DropDownListSearchBy=columnView&AvailabilitySearchInputScheduleSelectView%24DdlCurrencyDynamic=IDR&ControlGroupScheduleSelectView%24AvailabilityInputScheduleSelectView%24HiddenFieldTabIndex1=4&ControlGroupScheduleSelectView%24AvailabilityInputScheduleSelectView%24market1=0%7EP%7E%7EP% 7ERGFR%7E%7E1%7EX%7CQG%7E+853%7E+%7E%7EDPS%7E04%2F22%2F2014+20%3A05%7ECGK%7E04%2F22%2F2014+20%3A50%7E&ControlGroupScheduleSelectView%24AvailabilityInputScheduleSelectView%24HiddenFieldView%Index2 24AvailabilityInputScheduleSelectView%24market2=0%7EQ%7E%7EQ%7ERGFR%7E%7E1%7EX%7CQG%7E+852%7E+%7E%7ECGK%7E04%2F23%2F2014+16%3A40%7EDPS%7E04%2F23%2F2014+ 19%3A30%7E&ControlGroup ScheduleSelectView%24ButtonSubmit=Lanjutkan

【问题讨论】:

  • Firebug 只显示浏览器完成的请求。它无法跟踪在服务器端完成的请求。因此,您可以添加您在此处看到的屏幕截图。
  • 太长了。但是,如果您想查看我的浏览器在网页上发布的内容,仅此而已。
  • 我假设当您展开请求并切换到其中的 Post 选项卡时,您会在 Firebug 的 Net panel 中看到以上内容,对吧?那么您实际上在哪里看到不正确的AvailabilitySearchInputSearchView 数据?您是否在处理数据的 PHP 脚本中的某处输出数据?
  • 是的,当我尝试使用真正的 URL(例如 https//:www.xxx.com/xxx)时,这就是我在 Firebug 的 Net Panel Post 选项卡中看到的实际情况。当我的本地主机将 POST 数据发送到 URL (localhost/test2.php) 时,我看到了AvailabilitySearchInputSearchView,我也用 firebug 对其进行了检查。当我使用echo 检查我的变量时,值仍然相同。
  • 我想我知道为什么我在 Firebug 的网络面板中的帖子与变量 $new_post 不匹配。可能是因为我在本地主机中从一个页面发布到另一个页面。这意味着我在萤火虫的网络面板中看到的帖子不是我的 php curl 帖子。是否可以检查我使用 php curl 发布的内容是否与我要发布的内容相同?

标签: php post curl firebug


【解决方案1】:

您不会在 Firebug 中看到 cURL 请求,因为它发生在服务器上。

当我的 localhost 将 POST 数据发送到 URL (localhost/test2.php) 时,我看到了 AvailabilitySearchInputSearchView,我还使用 firebug 对其进行了检查。

如果您在 Firebug 中看到 AvailabilitySearchInputSearchView,但是当您在通过 curl_exec() 调用的 PHP 脚本中 echo 时获得正确的 POST 正文,则您的问题与 cURL 请求无关。

【讨论】:

  • 如果我的回答适合解决您的问题,您可以点赞或接受。您可能还想更新您的问题以进一步澄清问题,以便人们可以提供更好的答案。
【解决方案2】:

您可以在将http_build_query() 传递给curl_setopt() 之前使用它,如下所示:

$post = array('foo'=>'bar',
              'baz'=>'boom',
              'cow'=>'milk',
              'php'=>'AvailabilitySearchInputScheduleSelectView$RadioButtonMarketStructure');

$post  = http_build_query($post);

$data = curl_init();
curl_setopt($data, CURLOPT_CONNECTTIMEOUT, 180);
curl_setopt($data, CURLOPT_URL, $url);
curl_setopt($data, CURLOPT_FAILONERROR,1);
curl_setopt($data, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($data, CURLOPT_VERBOSE, 1);
curl_setopt($data, CURLOPT_POST, true);
curl_setopt($data, CURLOPT_RETURNTRANSFER, true);
curl_setopt($data, CURLOPT_POSTFIELDS, $post );
curl_setopt($data, CURLOPT_FAILONERROR,0);
curl_setopt($data, CURLINFO_HEADER_OUT, true);
curl_setopt($data, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($data, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($data, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0");
$result = curl_exec($data);

【讨论】:

  • $new_post 变量中的字符串用单引号括起来,所以$ 符号不会被解释。
  • @SebastianZartner 你说得对,我忘了。
  • 什么是未解释的标志?这与我的帖子无关吗?请告诉我。 @SebastianZartner
  • @hkjhj 符号是美元符号。 Tuga 已经从他/她的回答中再次删除了与之相关的句子。
猜你喜欢
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多