2

我正在使用 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 而不对库代码进行更改,但这目前有效。对于如何在不破解库的情况下进行操作的任何建议,我将不胜感激。

4

1 回答 1

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

发布数据

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));
于 2011-09-13T19:39:46.103 回答