我正在使用Zend_Http_Client将一组数据发送到运行PHP的服务器。但是,服务器期望myField[]
形式的数据,即我有一组复选框,用户可以检查多个。我目前的代码是:
foreach ($myValues as $value) {
$this->client->setParameterPost('myField[]', $value);
}
但是,Zend_Http_Client似乎只是覆盖 myField[]
,每次循环时都会使用新值。如何使用Zend_Http_Client添加同名的多个POST字段?
更新
我实际上通过黑客攻击Zend_Http_Client代码找到了一种方法。然而,这并不理想。我是这样做的:
首先,我只是将值添加到POST字段中,如下所示:
$myValues = array(0,1,2);
$this->client->setParameterPost('myField', $myValues);
在函数_prepareBody()
中,Zend_Http_Client使用以下代码构建POST数据:
$body = http_build_query($this->paramsPost, '', '&');
如果查看它构建的POST数据,它看起来像这样:
myField[0]=0&myField[1]=1&myField[2]=2
当然,它是url编码的,所以它看起来像这样:
myField%5B0%5D=0&myField%5B1%5D=1&myField%5B2%D=2
所以,我刚刚添加preg_replace
来制作[0] - > [],[1] - > []等:
$body = preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '%5B%5D=', $body);
我宁愿只使用Zend_Http_Client而不更改库代码,但现在可以使用了。我非常感谢有关如何在不破坏库的情况下进行操作的任何建议。
答案 0 :(得分:3)
最简单的方法可能就是自己设置原始帖子:
$values = array(
0,
1,
2,
);
$key = 'myField';
$rawData = '';
foreach ($values as $value) {
if ($rawData !== '') {
$rawData .= '&';
}
$rawData .= $key . '%5B%5D=' . $value;
}
$client = new Zend_Http_Client();
$client->setRawData($rawData);
$client->setUri('http://www.davidcaunt.co.uk/');
$client->request(Zend_Http_Client::POST);
$request = $client->getLastRequest();
//Zend_Debug::dump($request);
Zend_Debug::dump(urldecode($request));
POSTDATA
MyField的[] = 0&安培; MyField的[] = 1&安培; MyField的[] = 2
如果你要在postdata中发送其他变量,你可能想要继承Zend_Http_Client并覆盖_prepareBody()
的实现,如下所示。
此修改旨在保持与将来的更新兼容,因此,除非设置了POST参数,并且表单不是多部分(文件上载),因此调用父方法:
class My_Http_Client extends Zend_Http_Client
{
function _prepareBody()
{
if (count($this->paramsPost) > 0 && $this->enctype == self::ENC_URLENCODED) {
$this->setHeaders(self::CONTENT_TYPE, self::ENC_URLENCODED);
$body = '';
foreach ($this->paramsPost as $key => $value) {
if (is_array($value)) {
foreach ($value as $v) {
$body .= $key . '%5B%5D=' . $v . '&';
}
} else {
$body .= $key . '=' . $value . '&';
}
}
return rtrim($body, '&');
}
return parent::_prepareBody();
}
}
用法
$client = new My_Http_Client();
$client->setParameterPost('name', 'John');
$client->setParameterPost('myField', array(0,1,2));
$client->setUri('http://www.davidcaunt.co.uk/');
$client->request(Zend_Http_Client::POST);
$request = $client->getLastRequest();
Zend_Debug::dump(urldecode($request));