application/json和application/x-www-form-urlencoded有什么区别?

253
这两个语句的区别是什么?

request.ContentType = "application/json; charset=utf-8";

webRequest.ContentType = "application/x-www-form-urlencoded";


3个回答

278

第一种情况是告诉Web服务器你正在发布JSON数据,例如:

{"Name": "John Smith", "Age": 23}
第二种情况是告诉Web服务器,您将在URL中对参数进行编码:
Name=John+Smith&Age=23

30
它对服务器端产生了什么影响?我看到像stackoverflow和Twitter这样的网站在像投票等AJAX请求中使用x-www-form-urlencoded。发送回的响应是JSON。我认为最好有一个对称的请求/响应对,即都是JSON。 - user
2
@AdamJohns:这篇博客值得一读,尽管它并没有确切回答“为什么”的问题:http://homakov.blogspot.in/2012/06/x-www-form-urlencoded-vs-json-pros-and.html - user
30
我的理解是,当要发送的数据更加复杂且包含许多层级关系时,使用JSON作为contentType会有所帮助;而在URL中发送简单参数则可以使用表单编码,在后端读取时无需太多代码。我想这回答了“为什么”的部分。 - Ankit Srivastava
@Medorator 晚来的评论。例如,当您发送一个包含对象数组的复杂JSON对象时,使用“application/x-www-form-urlencoded”会使服务器(在我的情况下是使用Poison的Elixir)感到困惑,并导致一些不适当的解析对象(它某种方式将嵌套的对象数组转换为映射,而不是列表)。在这种情况下,使用“application/json”应该是正确的选择。 - xji

38

webRequest.ContentType = "application/x-www-form-urlencoded";

  1. "application/x-www-form-urlencoded"这个名称从哪里来?

    如果您发送HTTP GET请求,可以使用查询参数:

    http://example.com/path/to/page?name=ferret&color=purple

    字段的内容被编码为查询字符串。"application/x-www-form-urlencoded"的名称源于上面的url查询参数,但查询参数位于请求体而不是url中。

    整个表单数据作为一个长查询字符串发送。查询字符串包含用"&"字符分隔的"name-value"对

    例如:field1=value1&field2=value2

  2. 它可以被称为简单请求-simple-不触发预检查

    简单请求必须具有某些属性。您可以在此处查看更多信息。其中之一是对于简单请求,Content-Type标头只允许三个值

    • application/x-www-form-urlencoded
    • multipart/form-data
    • text/plain

3.对于大多数扁平的参数树,"application/x-www-form-urlencoded"是经过试验的。

request.ContentType = "application/json; charset=utf-8";

  1. 数据将是json格式。

AxiosSuperagent是更受欢迎的npm HTTP库之一,它们默认使用JSON主体。

{
  "id": 1,
  "name": "Foo",
  "price": 123,
  "tags": [
    "Bar",
    "Eek"
  ],
  "stock": {
    "warehouse": 300,
    "retail": 20
  }
}
  • "application/json" Content-Type 是预检请求之一。
  • 现在,如果请求不是简单请求,浏览器会自动发送一个HTTP请求,通过OPTIONS方法来检查是否安全发送原始请求。如果是,则发送实际请求。您可以在这里查看更多信息。
  • application/json 对于初学者很友好。 URL编码数组可能会让人崩溃!

  • 虽然application/json很适合初学者,但在生产服务器中使用它是否可行?在我的情况下,前端不是网站,而是移动应用程序。 - TheNoobDeveloper0299
    1
    使用JSON进行请求和响应是完全可以的。 - Therenca

    7

    两者之间最大的差异之一是,以JSON编码的帖子通常会保留发送的值的数据类型(只要它们是有效的JSON数据类型),而application/x-www-form-urlencoded通常会将所有属性转换为字符串。

    例如,在以下JSON编码的帖子中:

    {"Name": "John Smith", "Age": 23}
    

    服务器很可能将Age属性解析为整数23。 而在
    Name=John+Smith&Age=23
    

    服务器很可能会将Age解析为字符串"23"。

    当然,如果你使用其他层来解析这些值并将它们转换为适当的类型,那么这可能不是一个问题。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接