【问题标题】:Making POST request using Curl, not working使用 Curl 发出 POST 请求,不起作用
【发布时间】:2012-03-14 10:29:57
【问题描述】:

我想发出一个 POST 请求以从该页面获取列车号的时间表:http://www.indianrail.gov.in/train_Schedule.html

我正在使用此代码,但它不起作用。产生的错误如下面的附件所示。 可能是什么问题?
PS:我在 $data 中使用 Firebug 获得了 cgi 路径和参数

$data = array('lccp_trnname' => '14553', 'getIt' => 'Get Schedule');

    $ch = curl_init();
    $useragent= "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1";
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent); // set user agent
    curl_setopt($ch, CURLOPT_URL, 'http://www.indianrail.gov.in/cgi_bin/inet_trnnum_cgi.cgi');
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

    $txResult = curl_exec($ch);

    print "$txResult\n";

:

【问题讨论】:

  • indianrail.gov.in 在您的站点中使用是非法的。而且您的 URL 也是错误的。在 CHK ENV 中失败 0 错误出现
  • 在您的代码中也添加了引用者 ("indianrail.gov.in/train_Schedule.html"),这似乎没有帮助。看不到任何遗漏的表单值......尽管他们已经采取了保护措施来阻止外部请求. 我建议找一个不同的(更开放的)数据源。
  • @Ing 知道了;请看下文。

标签: php curl


【解决方案1】:

假设您有权以编程方式使用该站点上的数据......

问题在于您将发布数据传递给 cURL 的方式。

CURLOPT_POSTFIELDS

要在 HTTP“POST”操作中发布的完整数据。要发布文件,请在文件名前加上 @ 并使用完整路径。可以通过使用格式为“;type=mimetype”的文件名来明确指定文件类型。此参数可以作为 urlencoded 字符串(如 'para1=val1&para2=val2&...')或作为字段名称作为键和字段数据作为值的数组传递。如果 value 是一个数组,则 Content-Type 标头将设置为 multipart/form-data。从 PHP 5.2.0 开始,使用 @ 前缀传递给此选项的文件必须是数组形式才能工作。

http://php.net/manual/en/function.curl-setopt.php

尝试自己编码发布数据并将其作为字符串传递:

$data = array('lccp_trnname' => '14553', 'getIt' => 'Get Schedule');

$fields_string = '';
foreach($data as $key=>$value) { $fields_string .= urlencode($key).'='.urlencode($value).'&'; }
rtrim($fields_string,'&');

然后设置选项:

curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);

【讨论】:

    【解决方案2】:

    你需要两件事:

    推荐人
    一个“application/x-www-form-urlencoded” POST 数据

    $params = 'lccp_trnname='.urlencode('14553').'&getIt='.urlencode('Get Schedule');
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    curl_setopt($ch,CURLOPT_REFERER, "http://www.indianrail.gov.in/train_Schedule.html");
    

    【讨论】:

    • 太棒了!第三行不是必需的。第一行做到了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多