0

以下代码将数据发送到一个测试页面,该页面只是 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;
?>  
4

2 回答 2

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;
        }
    }
}

?>
于 2012-06-14T17:39:30.150 回答
0

curl_setopt手册页中解释了这些选项。提供的信息CURLOPT_POSTFIELDS是这样的:

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

所以我猜不是这样:

CURLOPT_POSTFIELDS =>'jsonData='.$jsonData,

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

CURLOPT_POSTFIELDS => array('jsonData' => $jsonData),
于 2012-06-14T16:20:08.717 回答