【问题标题】:Postman Chrome: What is the difference between form-data, x-www-form-urlencoded and rawPostman Chrome:form-data、x-www-form-urlencoded 和 raw 有什么区别
【发布时间】:2014-12-30 15:41:30
【问题描述】:

我正在使用 Postman Chrome 扩展程序来测试网络服务。

数据输入共有三个选项。

我猜raw 是用来发送 JSON 的。

另外两个form-datax-www-form-urlencoded有什么区别?

【问题讨论】:

标签: forms web-services rest postman


【解决方案1】:

让我们放轻松,一切都是关于如何发出 http 请求的:

1- x-www-form-urlencoded

http 请求:

GET /getParam1 HTTP/1.1
User-Agent: PostmanRuntime/7.28.4
Accept: */*
Postman-Token: a14f1286-52ae-4871-919d-887b0e273052
Host: localhost:12345
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 55

postParam1Key=postParam1Val&postParam2Key=postParam2Val

2-原始

http 请求:

GET /getParam1 HTTP/1.1
Content-Type: text/plain
User-Agent: PostmanRuntime/7.28.4
Accept: */*
Postman-Token: e3f7514b-3f87-4354-bcb1-cee67c306fef
Host: localhost:12345
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 73

{
    postParam1Key: postParam1Val,
    postParam2Key: postParam2Val
}

3-form-data

http 请求:

GET /getParam1 HTTP/1.1
User-Agent: PostmanRuntime/7.28.4
Accept: */*
Postman-Token: 8e2ce54b-d697-4179-b599-99e20271df90
Host: localhost:12345
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: multipart/form-data; boundary=--------------------------140760168634293019785817
Content-Length: 181

----------------------------140760168634293019785817
Content-Disposition: form-data; name="postParam1Key"

postParam1Val
----------------------------140760168634293019785817--

【讨论】:

    【解决方案2】:

    以下是一些补充示例,用于查看 Postman 在请求中传递的原始文本。您可以通过打开 Postman 控制台看到这一点:

    表单数据

    标题

    content-type: multipart/form-data; boundary=--------------------------590299136414163472038474
    

    身体

    key1=value1key2=value2
    

    x-www-form-urlencoded

    标题

    Content-Type: application/x-www-form-urlencoded
    

    身体

    key1=value1&key2=value2
    

    原始文本/纯文本

    标题

    Content-Type: text/plain
    

    身体

    This is some text.
    

    原始 json

    标题

    Content-Type: application/json
    

    身体

    {"key1":"value1","key2":"value2"}
    

    【讨论】:

    • 如果您将{"key1":"value1","key2":"value2"} 作为原始文本 发送会怎样?是否等同于使用 Raw json?我找不到说明差异的地方
    • @The 正文将是等效的,但如果服务器正在寻找 JSON,Content-Type 标头将被错误命名。
    • 这篇文章没有解决 form-data 和 x-www-form-urlencoded 之间的区别。
    【解决方案3】:

    多部分/表单数据

    注意。有关文件上传的更多信息,请咨询RFC2388,包括向后兼容性问题、“multipart/form-data”与其他内容类型之间的关系、性能问题等。

    有关表单安全问题的信息,请参阅附录。

    内容类型“application/x-www-form-urlencoded”对于发送大量二进制数据或包含非 ASCII 字符的文本效率低下。内容类型“multipart/form-data”应用于提交包含文件、非 ASCII 数据和二进制数据的表单。

    内容类型“multipart/form-data”遵循RFC2045 中概述的所有多部分 MIME 数据流的规则。 “multipart/form-data”的定义可在 [IANA] 注册表中找到。

    “multipart/form-data”消息包含一系列部分,每个部分代表一个成功的控件。部件按照相应控件出现在文档流中的相同顺序发送到处理代理。部分边界不应出现在任何数据中;如何做到这一点超出了本规范的范围。

    与所有多部分 MIME 类型一样,每个部分都有一个可选的“Content-Type”标头,默认为“text/plain”。用户代理应提供“Content-Type”标头,并附带“charset”参数。

    application/x-www-form-urlencoded

    这是默认的内容类型。使用此内容类型提交的表单必须编码如下:

    控件名称和值被转义。空格字符替换为+', and then reserved characters are escaped as described in [RFC1738], section 2.2: Non-alphanumeric characters are replaced by %HH'、一个百分号和两个表示字符的ASCII 码的十六进制数字。换行符表示为“CR LF”对(即,%0D%0A'). The control names/values are listed in the order they appear in the document. The name is separated from the value by =' 和名称/值对由 `&' 分隔。

    application/x-www-form-urlencoded 发送到服务器的 HTTP 消息的主体本质上是一个巨大的查询字符串——名称/值对由 & 分隔,名称与值由等号 (=) 分隔.这方面的一个例子是:

    MyVariableOne=ValueOne&MyVariableTwo=ValueTwo
    

    内容类型“application/x-www-form-urlencoded”对于发送大量二进制数据或包含非 ASCII 字符的文本效率低下。内容类型“multipart/form-data”应用于提交包含文件、非 ASCII 数据和二进制数据的表单。

    【讨论】:

      【解决方案4】:

      这些是 W3C 定义的不同表单内容类型。 如果你想发送简单的文本/ASCII 数据,那么 x-www-form-urlencoded 就可以了。这是默认设置。

      但如果您必须发送非 ASCII 文本或大型二进制数据,则 form-data 就是为此。

      如果您想发送纯文本或 JSON 或任何其他类型的字符串,您可以使用 Raw。顾名思义,Postman 按原样发送您的原始字符串数据,无需修改。您可以使用下拉菜单中的内容类型标头来设置您要发送的数据类型。

      Binary 可以在您想将非文本数据附加到请求时使用,例如视频/音频文件、图像或任何其他二进制数据文件。

      请参阅此链接以进一步阅读: Forms in HTML documents

      【讨论】:

      • 二进制呢?
      • 我现在有一个包含 4 个文本字段和 1 个文件上传字段的表单,请建议我使用哪个选项(表单数据或 x-www-form-urlencoded)来提交这 5 个字段值在邮递员?提前致谢。
      • @Kamlesh,很抱歉回复晚了,Postman 中表单数据的关键字段有一个下拉菜单,您可以在其中选择它是文本字段还是文件。您可以将其设置为文件,然后浏览要附加到正文的文件。希望对您有所帮助。
      【解决方案5】:

      这解释得更好: Postman docs

      请求正文

      在构建请求时,您会经常处理请求正文编辑器。 Postman 允许您发送几乎任何类型的 HTTP 请求(如果您无法发送某些内容,请告诉我们!)。正文编辑器分为 4 个区域,根据正文类型有不同的控件。

      表单数据

      multipart/form-data 是网络表单用于传输数据的默认编码。 这模拟了在网站上填写表单并提交。表单数据编辑器允许您为数据设置键/值对(使用键值编辑器)。您也可以将文件附加到密钥。请注意,由于 HTML5 规范的限制,文件不会存储在历史记录或集合中。您必须在发送请求时再次选择文件。

      urlencoded

      此编码与 URL 参数中使用的编码相同。您只需要输入键/值对,Postman 就会正确地对键和值进行编码。请注意,您不能通过此编码模式上传文件。 form-data 和 urlencoded 之间可能存在一些混淆,因此请务必先检查您的 API。

      原始

      原始请求可以包含任何内容。除了替换环境变量外,Postman 不会触及在原始编辑器中输入的字符串。您在文本区域中输入的任何内容都会随请求一起发送。原始编辑器允许您设置格式类型以及您应该与原始正文一起发送的正确标题。您也可以手动设置 Content-Type 标头。通常,您会在此处发送 XML 或 JSON 数据。

      二进制

      二进制数据允许您发送无法在 Postman 中输入的内容。例如,图像、音频或视频文件。您也可以发送文本文件。如前面在表单数据部分所述,如果您通过历史记录或集合加载请求,则必须重新附加文件。

      更新

      正如VKK 所指出的,WHATWG spec 说 urlencoded 是表单的默认编码类型。

      这些属性的无效值默认是 application/x-www-form-urlencoded 状态。 enctype 属性的缺失值默认也是 application/x-www-form-urlencoded 状态。

      【讨论】:

      • 邮递员文档有误。 html.spec.whatwg.org/multipage/… 上提供的 WHATWG 的 HTML5 规范明确定义了表单元素的 enctype 属性的默认值“application/x-www-form-urlencoded”。换句话说,“application/x-www-form-urlencoded”是 web 表单用于传输数据的默认编码(以 HTTP 术语 Content-Type),而不是 multipart/form-data。要在表单提交时发送 HTTP post 请求,其内容类型为 multipart/form-data,必须明确指定此作为 enctype 值。
      • 那么与Content-Type: application/json 标头发送的form-data(在Postman UI 中使用键值对输入)有什么区别;和 raw 数据以 json 形式输入,例如 {foo: bar} 具有相同的 Content-Type: application/json 标头?
      猜你喜欢
      • 2012-04-09
      • 2019-05-26
      • 2020-10-06
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      相关资源
      最近更新 更多