【问题标题】:HTTP POST - Can it contain complex objects directly?HTTP POST - 它可以直接包含复杂的对象吗?
【发布时间】:2013-09-30 17:26:37
【问题描述】:

从我读过的所有内容来看,它似乎总是string=string&string=string... 的形式(所有字符串都被编码以排除&=)但是,搜索它(例如维基百科,SO,... ) 我还没有发现提到的明确限制。

(当然可以发送复杂对象二进制的base64字符串。这不是问题。)但是:

POST 可以直接包含复杂对象还是全部作为字符串发送?

【问题讨论】:

  • HTTP 本身只是基于字符串。没有“对象”的概念,只有文本。 “对象”的定义取决于您通过 HTTP 传输的任何数据格式(XML、JSON、二进制文件……)
  • @nneonneo 谢谢。这似乎回答了我的问题。您可以将其转换为答案。 (不过如果你有一些来源,那就太好了。)
  • 不确定我是否真的需要来源...这正是 HTTP 的设计方式。它是一个(超)文本传输协议。

标签: c# http post


【解决方案1】:

HTTP 中没有任何东西可以阻止二进制数据的发布。您不必将二进制数据转换为 base64 或其他文本编码。尽管常见的“key1=val1&key=val2”用法非常传统且方便,但它不是必需的。它只取决于发送者和接收者达成的协议。请参阅这些线程或谷歌“http post binary data”等。

Sending binary data over http

How to correctly send binary data over HTTPS POST?

【讨论】:

  • 当然,你不能随便张贴一堆原始二进制数据并期望它神奇地被理解——显然需要接收方的正确解释。
【解决方案2】:

它只是一个字符串,就像任何二进制流一样。不过,有多种方法可以对复杂对象进行编码以适应字符串。 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

【讨论】:

  • 或者,您可以做 ASP.NET 所做的事情,将您的对象状态推入一个巨大的 base64 编码 blob (__VIEWSTATE),每个 POST 请求都会传递该 blob。
  • 谢谢。 (在倒数第二段中,您的意思可能是“不能”而不是“可以”。)
【解决方案3】:

HTTP 本身只是基于字符串。没有“对象”的概念,只有文本。 “对象”的定义取决于您通过 HTTP 传输的任何数据格式(XML、JSON、二进制文件……)。

因此,POST 可以包含“复杂对象”,如果它们被适当地编码为文本。

【讨论】:

  • 谢谢。尽管我将其表述为“所以,不,POST ...”。 (只是语义上的区别。)
  • @ispiro:你问了一个“或”的问题,所以实际上“是”和“否”都没有意义。已修改。
  • 是的。 (在我编辑标题之前你已经回答了。)再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
相关资源
最近更新 更多