2013-09-30 2 views
0

Из всего, что я прочитал, кажется, что он всегда имеет форму string=string&string=string... (все строки кодируются, чтобы исключить & и =) однако, ища его (например, Wikipedia, SO, ...) Я не нашел, что упомянутое как явное ограничение.HTTP POST - Может ли он содержать сложные объекты напрямую?

(Конечно, base64 строка бинарного сложных объектов может быть отправлена ​​Это не вопрос.). Но:

Может POST содержат сложные объекты непосредственно или все это передается в виде строки?

+0

HTTP сам по себе только на основе строк. Нет понятия «объекты», только текст. Определение «объект» зависит от того, какой формат данных вы переносите по HTTP (XML, JSON, двоичные файлы, ...) – nneonneo

+0

@nneonneo Спасибо. Это похоже на мой вопрос. Вы можете преобразовать это в ответ. (Хотя, если у вас есть источник, это было бы хорошо.) – ispiro

+0

Не уверен, что мне действительно нужен источник ... это просто способ HTTP. Это (гипер) текстовый транспортный протокол. – nneonneo

ответ

1

В HTTP-протоколе нет ничего, что предотвращало бы размещение двоичных данных. Вам не нужно преобразовывать двоичные данные в base64 или другие текстовые кодировки. Хотя общий «key1 = val1 & ключ = val2» используется очень широко и удобно, он не требуется. Это зависит только от того, на что согласны отправитель и получатель. См. Эти потоки или «почтовые двоичные данные» Google или тому подобное.

Sending binary data over http

How to correctly send binary data over HTTPS POST?

+0

Спасибо. Кажется, это правильный ответ. – ispiro

+0

Конечно, вы не можете просто произвольно отправить кучу необработанных двоичных данных и ожидать, что это будет волшебным образом понято - очевидно, правильная интерпретация на принимающей стороне. –

1

HTTP сам по себе основан только на строках. Нет понятия «объекты», только текст. Определение «объект» зависит от того, какой формат данных вы переносите по HTTP (XML, JSON, двоичные файлы, ...).

Таким образом, POST может содержать «сложные объекты», если они соответствующим образом закодированы в текст.

+0

Спасибо. Хотя я бы назвал это «Итак, нет, POST ...». (Просто семантическая разница.) – ispiro

+0

@ispiro: вы задали вопрос «или», поэтому на самом деле ни «да», ни «нет» не имеют смысла. Измененный. – nneonneo

+0

Правда. (И вы ответили, прежде чем я отредактировал название тоже.) Еще раз спасибо. – ispiro

1

Это просто строка, как и любой бинарный поток. Существуют различные способы кодирования сложных объектов, чтобы вписаться в строку. base64 - это вариант, и, следовательно, json (последний, вероятно, более желателен).

PHP имеет специфический способ справиться с этим .. Это:

a[]=1&a[]=2 

Будет ли результат в массив с 1, 2.

Это:

a[foo]=bar&a[gir]=zim 

Создает также массив с 2 ключами.

Я также видел этот формат в некоторых рамках:

a.foo=bar&b.gir=zim 

Так что пока urlencoding не имеет специфический, стандартный синтаксис, чтобы сделать это .. это не означает, что вы можете добавить смысл и сделать свой собственный Постобработка.

Если вы создаете API, вам, вероятно, лучше всего не использовать urlencoding ... Там есть гораздо более способные и лучшие форматы. Вы можете использовать все, что угодно, Content-Type.

+0

Альтернативно, вы можете сделать то, что делает ASP.NET, и засунуть состояние вашего объекта в гигантский base64-закодированный blob ('__VIEWSTATE'), который передается по каждому запросу POST. – nneonneo

+0

Спасибо. (Во втором-последнем абзаце вы, вероятно, имели в виду «не может» не «может».) – ispiro

Смежные вопросы