Кодирование и формат отправляемых данных - Компьютерные сети

По умолчанию - application/x-www-form-urlencoded Все символы не из первой половины ASCII заменяются их кодами, например, "a" на "%E0". Пробелы - на "+", "&;" - на "%26".

Multipart/form-data - используется для отправки двоичных данных и данных смешанного типа.

Существует два типа кодирования содержания (тела) HTTP-сообщения, которые можно определить в форме:

    - application/x-www-form-urlencoded - multipart/form-data

Первый тип кодирования выбирается по умолчанию и является основным способом. В URL документа можно использовать только символы набора Latin1. Это первая половина таблицы ASCII за вычетом первых 20 символов. Все остальные символы заменяются своими шестнадцатеричными эквивалентами. Кроме того, такие символы, как "+" или "&;", играют роль разделителей или коннекторов. Если они встречаются в значении поля, то тоже заменяются на шестнадцатеричный эквивалент. Наиболее характерно это для работы с русским алфавитом. Поэтому скрипт, который принимает запросы, должен уметь эти символы декодировать.

Второй тип применяется для передачи двоичной информации в теле HTTP-сообщения. Если проводить аналогии с электронной почтой, то multipart/form-data обеспечивает присоединение файла данных (attachment) к HTTP-запросу. Наиболее типичным примером является передача файла с машины пользователя на сервер:

<FORM ACTION=script. cgi METHOD=post

ENCTYPE=multipart/form-data>

<INPUT NAME=n1 VALUE="Поле1">

<INPUT NAME=n2 TYPE=file>

<INPUT TYPE=BUTTON VALUE="Отправить">

</FORM>

В данном случае HTTP-сообщение будет очень похоже на почтовое сообщение в стандарте MIME (собственно, это и есть MIME-сообщение, только передается оно по протоколу HTTP). Естественно, что для приема такого сообщения нужен скрипт, который бы смог разобрать его на части, а потом декодировать необходимую информацию.

Сообщение типа "multipart/form-data" состоит из нескольких частей, каждая их которых представляет успешный управляющий элемент. Части отправляются обрабатывающему агенту в том порядке, в котором соответствующие управляющие элементы представлены в потоке документа. Границы частей не должны находиться в данных.

Как и во всех составных типах MIME, каждая часть имеет необязательный заголовок "Content-Type", для которого по умолчанию устанавливается значение "text/plain". Агенты пользователей должны предоставлять заголовок "Content-Type" с параметром "charset".

Каждая часть должна содержать:

    - заголовок "Content-Disposition", имеющий значение "form-data"; - атрибут именования, определяющий имя соответствующего управляющего элемента. Имена управляющих элементов, изначально закодированные с использованием наборов символов, отличных от ASCII, могут кодироваться с помощью метода, описанного в [RFC2045].

Application/x-www-form-urlencoded

BigText= TextTextText&;pol1= m

Multipart/form-data

------------Gt1CO3wAR7XTbm1eE7LoA6

Content-Disposition: form-data; name="BigText "

TextTextText

------------Gt1CO3wAR7XTbm1eE7LoA6

Content-Disposition: form-data; name="pol1 "

M

------------Gt1CO3wAR7XTbm1eE7LoA6--

Multipart/form-data - для отправки больших объемов данных или двоичных файлов

Пример CGI-скрипта (GET) на PascalABC

S:=Environment. GetEnvironmentVariable('QUERY_STRING');

Writeln(file,'Переменная окружения QUERY_STRING: ',s);

Writeln('Content-Type: text/html');

Writeln('');

Writeln('<html> <head> <title> OK </title> </head> <body> <h1> Введенные в форму данные успешно записаны в файл zapros_get. txt </h1></body>')

Пример CGI-скрипта (POST) на PascalABC

Val(Environment. GetEnvironmentVariable('CONTENT_LENGTH'),n, err);

Writeln(file,'Размер: ',n);

Writeln(file,'Данные:');

SetLength(s, n);

For i:=0 to n-1 do

Read(s[i]);

For i:=0 to n-1 do

Write(f, s[i]);

Writeln('Content-Type: text/html');

Writeln('');

Writeln('<html> <head> <title> OK </title> </head> <body> <h1> Введенные в форму данные успешно записаны в файл zapros_post. txt </h1></body>')

Похожие статьи




Кодирование и формат отправляемых данных - Компьютерные сети

Предыдущая | Следующая