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