составная форма, кодирующая строку с помощью PHP

Я пишу PHP-код для отправки строковых данных XML на сайт с использованием HTTP-сообщения с кодировкой encType: multipart/form-data. Я думаю об использовании функции PHP http_post_data. Я считаю, что перед отправкой данных мне нужно их закодировать, но я не вижу функции PHP, которая сделает это за меня, и я не знаю, как написать такую ​​функцию самостоятельно.

Это то, что у меня есть до сих пор (но http_request_body_encode(), безусловно, не правильная функция):

$options = array('headers' => array('Content-Type' => 'multipart/form-data'));
$fields = array('operation' =>'doMDUpload', 'login_id' => $doi_username, 'login_passwd' => $doi_password, 
  'area' => ($debug ? "test" : "live"), 'fname' => $writer->outputMemory());
$info = array();
$response = http_post_data($crossref_deposit_url, http_request_body_encode($fields, array()), $options, $info);

$writer->outputMemory — это строка XML, содержащая библиометрические данные.


person Nigel    schedule 19.02.2011    source источник


Ответы (1)


Правильной функцией будет http://php.net/http_request_body_encode. Но это не основная функция. Он доступен с расширением http pecl, которое даже не установлено по умолчанию в PHP 5.3.

Он также не генерирует multipart/form-data по умолчанию (вместо x-www-form-urlencode). Однако вы можете обмануть его, предоставив поддельный массив $files:

print http_request_body_encode(array("field"=>123), array(NULL=>NULL));

Теперь вторая проблема заключается в том, что вам нужно вырезать первую строку. Это Content-Type с правильным атрибутом boundary=. А мне это кажется мелочью.

Поэтому лучше использовать класс HttpRequest напрямую и позволить ему обрабатывать POST-кодирование и отправку в однажды. В качестве альтернативы используйте класс PEAR или Zend, которые также работают независимо от наличия модуля расширения HTTP.

person mario    schedule 19.02.2011
comment
Спасибо за ваш очень полезный ответ, но он оставляет меня с парой моментов, которые я не совсем понимаю: - person Nigel; 20.02.2011
comment
Спасибо за ваш очень полезный ответ, но он оставляет меня с парой моментов, которые я не совсем понимаю: (1) вам нужно вырезать первую строку. Это Content-Type с правильным атрибутом border=. Зачем мне это делать? Разве я не должен удалить свой код (строка 1 кода в моем вопросе), который устанавливает заголовок? (2) Если бы я использовал класс HttpRequest напрямую, как мне сказать ему использовать кодировку multipart/form-data? - person Nigel; 20.02.2011
comment
@micrology: вы должны вырезать строку типа контента, потому что в противном случае это будет неправильный формат. Строка заголовка должна быть частью заголовков, а не тела содержимого. Я не знаю, как заставить multipart/, может быть, с тем же трюком $files на ::setPostFiles. - person mario; 20.02.2011