Я использую Zend_Http_Client для POST набора данных на моем сервере с PHP. Тем не менее, сервер ожидает данные в форме myField[]
, т. myField[]
У меня есть набор флажков, и пользователь может проверить несколько. Мой текущий код:
foreach ($myValues as $value) { $this->client->setParameterPost('myField[]', $value); }
Однако кажется, что Zend_Http_Client просто перезаписывает myField[]
с новым значением каждый раз, когда он проходит цикл. Как добавить несколько полей POST с тем же именем с помощью Zend_Http_Client?
ОБНОВИТЬ
Я действительно понял способ сделать это, взломав сам код 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 без внесения изменений в код библиотеки, но это работает пока. Я был бы очень благодарен за любые предложения о том, как это сделать, не взламывая библиотеки.
Самый простой подход может состоять в том, чтобы самостоятельно настроить исходное тело сообщения:
$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));