php curl发布数据未收到

时间:2012-06-14 16:03:28

标签: php curl

以下代码将数据发送到测试页面,该测试页面只是var_dumps _REQUEST变量。页面没有得到post参数但获取了get参数。为什么会发生这种情况?

<?php
     $jsonData = '{"Page":"index.html","KeyNumber":12132321}';
     $timeout = 20; 
     $options = array(
       CURLOPT_URL => "http://myadmin/postdump.php?AID=100&age=5&ishide=0",
       CURLOPT_RETURNTRANSFER => true, 
       CURLOPT_CONNECTTIMEOUT => $timeout,
       CURLOPT_POST => true,
       CURLOPT_POSTFIELDS =>'jsonData='.$jsonData,
       CURLOPT_ENCODING=>"",
       CURLOPT_FOLLOWLOCATION=>true
       );

     $ch = curl_init();
     curl_setopt_array($ch, $options);
     $file_contents = curl_exec($ch);
     curl_close($ch);

     echo  $file_contents;
?>  

2 个答案:

答案 0 :(得分:0)

curl_setopt手册页中介绍了这些选项。 CURLOPT_POSTFIELDS提供的信息是:

  

要在HTTP“POST”操作中发布的完整数据。要发布文件,   使用@预先添加文件名并使用完整路径。文件类型可以是   通过跟随文件名中的类型明确指定   format'; type = mimetype'。 此参数可以作为传递   urlencoded字符串,如'para1 = val1&amp; para2 = val2&amp; ...'或作为数组   字段名称为键,字段数据为值。如果value是一个数组,   Content-Type标头将设置为multipart / form-data。自PHP起   5.2.0,如果使用@前缀将文件传递给此选项,则value必须是数组。

所以我猜这不是这个:

CURLOPT_POSTFIELDS =>'jsonData='.$jsonData,

......你想要这样的东西:

CURLOPT_POSTFIELDS => array('jsonData' => $jsonData),

答案 1 :(得分:0)

尝试使用urlencode函数对字段的值进行编码,我还建议将标头添加到请求中以模拟表单请求,并将带有标头的数组传递给CURLOPT_HTTPHEADER选项,例如

   $headers = array(
      'Host: domain.com',
      'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
      'Accept-Encoding: gzip, deflate',
      'Content-Type: application/x-www-form-urlencoded'
   );

最近我还在下面附带的curl实用程序类中帮助测试某些表单,希望这会有所帮助:

<?php

define('CURLMANAGER_USERAGENT_MOZ4', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)');
/**
 * 
 * Makes remote calls via http protocol
 * @author Alejandro Soto Gonzalez
 *
 */
class CURLManager {
    private $fields = array();
    private $headers = false;
    private $method = '';
    private $url = '';
    private $response = '';
    private $header = false;

    /**
     * 
     * Constructor
     * @return void
     */
    public function __construct() {

    }

    /**
     * 
     * Executes the http request
     * 
     * @param string $useragent Request user agent
     * @param string $fields Post values to be sent in the request body
     * @param array $headers Request headers
     * @param string $method Http method POST, GET, etc..
     * @param string $url Remote url
     * @param boolean $header true if the response should contain the http headers and  false if not
     * @return void
     */
    public function executeRequest($useragent, $fields, $headers, $method = 'POST', $url, $header = false) {
        $this->fields = $fields;
        $this->method = $method;
        $this->url = $url;
        $this->headers = $headers;
        $this->header = $header;
        $this->initializeCURL($useragent);
    }

    /**
     * 
     * Gets the response retrieved from the http request
     * @return void
     */
    public function getResponse() {
        return $this->response;
    }

    /**
     * 
     * Initializes curl and executes the request
     * @param string $useragent Request user agent
     * @return void
     */
    private function initializeCURL($useragent) {
        $ch = curl_init($this->url);
        $this->addFieldsToRequestBody($ch, $this->method);
        $this->addGenericOptions($ch, $useragent);
        $this->showResponseHeaders($ch, $this->header);
        $this->addRequestHeaders($ch, $this->headers);
        $this->response = curl_exec($ch);
        curl_close($ch);
    }

    /**
     * 
     * Adds generics options to the current curl object
     * @param curlObject $ch
     * @param string $useragent Request user agent
     * @return void
     */
    private function addGenericOptions($ch, $useragent) {
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/sourceforge/bouncer-logger-tester/cookies.txt');
    }

    /**
     * 
     * Adds the data fields to request body
     * @param curlObject $ch
     * @param string $method Http method POST, GET, etc..
     * @return void
     */
    private function addFieldsToRequestBody($ch, $method) {
        if ($this->method=='POST') {
            curl_setopt($ch, $this->getCurlMethod(), true);
            curl_setopt($ch, $this->getCurlFieldsMethod(), $this->fields);
        }
    }

    /**
     * 
     * Adds headers to the current request
     * @param curlObject $ch
     * @param array $headers Array containing the http header
     */
    private function addRequestHeaders($ch, $headers) {
        var_dump($headers);
        if ($headers !== false) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        }
    }

    /**
     * 
     * Gets the curl method id
     * @return integer
     */
    private function getCurlMethod() {
        switch ($this->method)  {
            case 'POST': return CURLOPT_POST;
            default: return CURLOPT_POST;
        }
    }

    /**
     * 
     * Show response headers in the full text response
     * @param curlObject $ch
     * @param boolean $show True to show headers and false to not
     * @return void
     */
    private function showResponseHeaders($ch, $show) {
        if ($this->header) {
            curl_setopt($ch, CURLOPT_HEADER, 1);
        }
    }

    /**
     * 
     * Gets curl fields option
     * @return void
     */
    private function getCurlFieldsMethod() {
        switch ($this->method)  {
            case 'POST': return CURLOPT_POSTFIELDS;
            default: return CURLOPT_POSTFIELDS;
        }
    }
}

?>