从我读过的所有内容来看,它似乎总是形式string=string&string=string...
(所有字符串都被编码为排除&
和=
)但是,搜索它(例如维基百科,SO,......)我没有发现提到的明确限制.
(当然可以发送复杂对象二进制的 base64 字符串。这不是问题。)但是:
POST 可以直接包含复杂对象还是全部作为字符串发送?
HTTP 中没有任何东西可以阻止二进制数据的发布。您不必将二进制数据转换为 base64 或其他文本编码。尽管常见的“key1=val1&key=val2”用法非常传统且方便,但它不是必需的。它只取决于发送者和接收者达成的协议。请参阅这些线程或谷歌“http post binary data”等。
HTTP 本身只是基于字符串。没有“对象”的概念,只有文本。“对象”的定义取决于您通过 HTTP 传输的任何数据格式(XML、JSON、二进制文件……)。
因此,POST 可以包含“复杂对象”,如果它们被适当地编码成文本。
它只是一个字符串,就像任何二进制流一样。不过,有多种方法可以对复杂对象进行编码以适应字符串。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
你想要的东西。