尝试使用 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;
}
}
}
?>